In vielen Assemblern wird eine Wertekopieranweisung normalerweise als "MOV" bezeichnet, und ihre Beschreibung in Handbüchern enthält normalerweise auch "move" (es können jedoch auch andere Wörter wie "load", "store", "extract" usw. verwendet werden. ) Es ist ungewöhnlich, eine ISA zu finden ), die dieser Konvention nicht entspricht.
Andererseits unterscheidet sich "move" in anderen Zusammenhängen von "copy" darin, dass die Quelle zerstört wird (z. B. "mv" vs. "cp" in Unix, Move [F6] in Norton Commander und Klone usw.). ) Assemblers "Move" hat wirklich eine semantische "Kopie", die den Quellwert intakt hält.
Ich habe festgestellt, dass dies spätestens seit IBM 1401 (1959) begonnen hat. IBM 360 verwendete dieses Wort jedoch nur zum Kopieren im Speicher, nicht jedoch für Operationen zwischen Registern und Speicher (bei denen "Laden" und "Speichern" verwendet wurde). . Aber warum ist es immer noch weit verbreitet und wird nicht durch "Kopieren" oder "Speichern" ersetzt?
Antworten:
In einigen Befehlssätzen gibt es unterschiedliche Befehle zum Laden eines Registers aus dem Speicher, Speichern eines Registers in den Speicher oder Übertragen von Dingen zwischen Registern. Während einige Assemblersprache Formen das Verb "Laden" für alles verwendet werden (zB Zilog Z80 Mnemonics verwenden
ld a,(1234h)
,ld (1234h),a
undld a,b
), und einige use "T" ransfer (zB das 6502 mit TXA für "Transfer X zu A"), einige use "Move" für Register-zu-Register-Operationen, um sie von Ladungen und Speichern zu unterscheiden. Wenn man ein Befehlsformat wie das 68000 hat, das die gleiche allgemeine Befehlsform für Register-zu-Register-, Register-zu-Speicher-, Speicher-zu-Register- und sogar Speicher-zu-Speicher-Operationen verwendet, lautet das Verb "move" wahrscheinlich ein besseres Allzweckverb als irgendeine der Alternativen.Ich habe keine Ahnung von Minicomputer- oder Mainframe-Anweisungssätzen vor dem 8080, aber der 8080 verwendete "Laden" und "Speichern" für die meisten Speicherzugriffsanweisungen und "Verschieben" für Register-zu-Register-Anweisungen, aber die meisten Anweisungen, die funktionieren könnten in einem beliebigen 8-Bit-Register könnte auch "M" bearbeitet werden, was der von HL adressierte Speicherort war, so dass ein "MOV" zu oder von "M" sich tatsächlich wie ein Laden oder Speichern verhält.
Ich vermute, dass die Unterscheidung zwischen "Kopieren" und "Verschieben" viel damit zu tun hat, dass Code weder Register erstellen noch zerstören kann. Sie existieren einfach. Ist es bei der Beschreibung des Verhaltens der Codesequenz
mov bx,ax / mov ax,1234
sinnvoller zu sagen, der erste Befehl kopiert bx nach ax, und der zweite Befehl zerstört den Wert inax
und ersetzt ihn durch den Wert 1234, oder ist es sinnvoller, den ersten Befehl anzuzeigen Die Anweisung hat den Wert von bx nach ax verschoben (der Wert in ax ist ein "egal"), und die zweite Anweisung lädt ax (was egal war) mit 1234? Manchmal ist das Quellregister nach einem Registerübertragungsbefehl noch aussagekräftig, aber da der Befehlssatz nichts enthält, was angibt, ob dies der Fall sein wird,quelle
Sie haben sicherlich recht. Die meisten, wenn nicht alle Instanzen einer mov-Anweisung sind tatsächlich eine Kopie.
Einige haben nicht einmal einen Film, für den es sich um eine Pseudoanweisung handelt
Verstehen Sie auch, dass die ASCII-Syntax willkürlich ist, der Maschinencode etwas bedeutet und für diesen Prozessor definiert und festgelegt ist. Meistens, wenn nicht die ganze Zeit, erstellt der Ersteller / Hersteller des Prozessors eine Syntax, um teilweise den Befehlssatz (Maschinencode) zu definieren, und teilweise um eine Syntax zu definieren, die mit einem Werkzeug funktioniert, das er auch erstellt oder in Auftrag gegeben hat, um diese Assemblersprache in eine Maschine umzuwandeln Code für ihren Prozessor. Sie können sicherlich zum Beispiel in den Gnu-Assembler gehen (der eine Tendenz hat, seine eigene Sache zu tun und sich sowieso nicht an die Syntax des Prozessorherstellers zu halten) und eine Kopier-Pseudo-Anweisung hinzufügen.
Anwendungsfälle: Heutzutage wird der meiste Assembler-Code vom Compiler generiert, und der Befehl mov wird am häufigsten verwendet, um einen Wert tatsächlich von einem Register in ein anderes zu verschieben, damit das Quellregister (Speicherort usw.) wieder verwendet werden kann. Aus Gründen der Aufrufkonvention für diesen Prozessor oder weil einige Befehle oder Befehlssätze nicht orthogonal sind, müssen Sie die Dinge verschieben. Sicherlich gibt es Zeiten, in denen eine Kopie eines Werts gewünscht wird und das mov verwendet werden kann, um diese Kopie zu erstellen.
Ich bezweifle ernsthaft, dass wir jemals erfahren werden, welche Person oder welches Team als erstes auf den Begriff gekommen ist und warum sie sich für das Verschieben der Kopie entschieden haben. Da wir uns daran gewöhnt haben, können wir es bei jedem neuen Befehlssatz wiederverwenden. Wie bereits erwähnt, verwenden einige Befehlssätze registergestützte Lade- und Speicherbefehle, wobei ein Operand ein Register und der andere eine Adresse ist, und mov nur für das Register, um Fälle zu registrieren. Andere Befehlssätze verwenden für jeden Operanden mov für register oder mem. Obwohl Sie sicherlich jedem / vielen der Open-Source-Assembler eine Kopie hinzufügen können, wird es schwieriger sein, die Traktion bei der Verwendung zu erlangen. Wenn Sie an einem Ort arbeiten, an dem Sie die Kontrolle über die ursprüngliche Syntax haben (Arbeit für einen Ort, an dem ein neuer Prozessor erstellt wird), an dem Sie festlegen können, dass das Register verschoben werden soll, wird als Kopie bezeichnet.
quelle
Einen Befehl zu ersetzen bedeutet, die Abwärtskompatibilität zu brechen. Ein Assembler mit der neuen Syntax kann keinen Code zusammenstellen, der mit der alten Syntax geschrieben wurde - es sei denn, dieser Code verwendet diese Anweisung nicht (und der einzige Ort, an dem Sie einen Assemblercode sehen, der nicht verwendet
MOV
wird, sind Syntaxbeispiele das zeigen andere Anweisungen ...)Compiler generieren normalerweise Assembly-Code und übergeben ihn automatisch an den Assembler. Sie müssen daher ebenfalls geändert werden, um dem neuen Assembler zu entsprechen. Wenn eine Sprache Inline-Assembler zulässt,
MOV
funktioniert der alte Quellcode, der Inline-Assembler mit Anweisungen verwendet, nicht mehr.Wir sprechen also von einem gigantischen Codefehler, und wofür? Dadurch wird die Sprache nicht mehr lesbar, da Sie im Gegensatz zu einer höheren Sprache keine Chance haben, zu sagen, was ein Assembly-Code tut, ohne Assembler zu kennen, und wenn Sie Assembler kennen, wissen Sie, was
MOV
passiert.Riesige Kosten ohne Gewinn erklären leicht, warum der Befehl nicht umbenannt wurde.
quelle