Warum heißt die Kopieranweisung normalerweise MOV?


23

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?


5
Wikipedia sagt : "Das Wort" Verschieben "für diese Operation ist genau genommen eine falsche Bezeichnung: Es hat wenig mit dem physikalischen Konzept zu tun, ein Objekt von A nach B zu verschieben, wobei Platz A dann leer wird; ein MOV erstellt stattdessen eine Kopie von den Zustand des Objekts bei A und überschreibt dabei den alten Zustand von B. Dies spiegelt sich in einigen anderen Assemblersprachen wider, indem Wörter wie " Laden" , " Speichern" oder " Kopieren" anstelle von "Verschieben" verwendet werden. "
Uwe Keim

@UweKeim hmm, ich habe vor der Frage nach Erklärungen gegoogelt, wurde aber nicht mit diesem Artikel gefüttert. Auf
jeden Fall

2
@gnat Ich hatte "Instruction Set Architecture" gemeint, keinen ISA-Bus. Ich habe es überarbeitet.
Netch

@ Dankeschön! Ich irgendwie zu verpassen geschafft , dass in einer großen Liste von Begriffsklärung bei Wikipedia
gnat

1
Ich bezweifle, dass es eine Möglichkeit gibt, herauszufinden, warum es ursprünglich als "Verschieben" statt als "Kopieren" bezeichnet wurde, aber Spekulieren macht Spaß. Auf der Wikipedia-Seite für Assemblersprache wird MOV als Vorgang zum "Verschieben einer Kopie der Daten" beschrieben, was eine interessante Interpretation darstellt. Eine andere Möglichkeit besteht darin, dass es sich bei der Operation im Hinblick auf die tatsächliche Nutzung von MOV konzeptionell um eine Datenbewegung handelt. dass uns die Quelle nicht mehr wichtig ist.
Ben Lee

Antworten:


10

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),aund ld 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,1234sinnvoller zu sagen, der erste Befehl kopiert bx nach ax, und der zweite Befehl zerstört den Wert in axund 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,


Ich habe keine Beweise, um Ihre Antwort zu stützen, aber es klingt auf jeden Fall genau richtig. Lade- / Speicheroperationen werden aufgrund des Wechsels zum Speicher / Cache einen anderen Pfad in der CPU / im Mikrocode einnehmen, aber das Wechseln zwischen Registern kann durchaus ein einziger Zyklus sein (es muss nicht auf andere Pipeline-Stufen gewartet werden) und ist daher eine Differenzierung wert. Aber das erklärt nicht Move-vs-Kopie ...
JBRWilkinson

Einverstanden. Betrachten Sie zB speicherabgebildete Eingabegeräte. Durch das Lesen eines Quellverzeichnisses kann es geändert werden - z. B. das gelesene Element aus einer Hardware-Warteschlange löschen und durch das nächste Element in der Warteschlange ersetzen. Das klingt eher nach einer Bewegung als nach einer Kopie - die Quelle enthält diese Informationen nicht mehr, nur das Ziel. Und dieses Verhalten wird nicht von der CPU bestimmt, sondern von diesem Speichergerät.
Steve314

Assemblersprachen verwenden Mnemonics, die "CPU-zentriert" sind. Das heißt, alles wird aus der Perspektive der CPU-Register benannt. Somit kopiert "Laden" normalerweise einen Wert in ein Register, wohingegen "Speichern" normalerweise einen Wert von einem Register in den Speicher kopiert. Wie kann man dann das Kopieren eines Wertes von einem Register in ein anderes aufrufen? "Verschieben" ist eine naheliegende Wahl. Wenn derselbe Mikrocode-Vorgang beide ausführt (wie beim 68000), ist "move" eine allgemeinere Wahl für das Laden / Speichern. "Copy" hätte verwendet werden können, ist aber möglicherweise überflüssig, da es wirklich keine echte "Verschiebung" gibt, bei der die Quelle leer gelassen wird.
DocSalvager

@DocSalvage: Wenn ein 32-Bit-Register eine feste Gruppe von 32 Flip-Flops oder Latches ist, die immer existieren, ist "move" nicht unbedingt sinnvoll. In Architekturen mit Registerumbenennung könnte jedoch ein "Verschieben" -Operand, der auch die Quelle ungültig macht, die Effizienz verbessern, indem ein virtuelles Register freigegeben wird. Ich habe noch nie davon gehört, aber ich kenne keine Architekturen, die mit Blick auf das Umbenennen von Registern entworfen wurden .
Supercat

@supercat: In der Computerhardware enthalten alle Register und alle Speicherorte jederzeit einen Wert. "Null" oder "leer" gibt es eigentlich nicht. Wir verwenden willkürliche Konventionen, um anzuzeigen, wenn die Register- oder Speicherinhalte ungültig sind. Sehr oft lassen wir "0" "null" bedeuten, aber nicht immer. Der "Null" -Zustand eines Speicherblocks kann beispielsweise durch Start- und Endadressen angezeigt werden, die an einem anderen Ort gespeichert sind. Es gibt auch zahlreiche andere Techniken. Letztendlich ist die Sprachmnemonik willkürlich, obwohl wir uns um die am weitesten verbreitete Option bemühen.
DocSalvager

0

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

add dest=source+zero.

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.


-4

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 MOVwird, 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, MOVfunktioniert 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 MOVpassiert.

Riesige Kosten ohne Gewinn erklären leicht, warum der Befehl nicht umbenannt wurde.


3
Wie beantwortet dies die gestellte Frage?
gnat

2
Der einzige Satz, der mit einem Fragezeichen endet, lautet "Aber warum wird er immer noch häufig verwendet und nicht durch" Kopieren "oder" Speichern "ersetzt?".
Idan Arye

2
Es erklärt nicht, warum der Befehl von Anfang an so benannt wurde, und zwar durch unzählige ISAs, die über viele Jahrzehnte von Grund auf neu entwickelt wurden (dh ohne Einschränkungen hinsichtlich der Abwärtskompatibilität). Wenn ein Anbieter die Mnemonik trotz Abwärtskompatibilität ändern möchte, kann er einen Alias ​​bereitstellen und dessen Verwendung fördern.

1
Wofür steht "OP"? Und ich habe keine wirkliche Erklärung gesehen.
Netch

1
Ich bin das Originalposter und ich werde sagen, dass das Kopieren zwischen Speicherzellen in S / 360 keine "geringfügig unterschiedliche Operation" ist, sondern nur ein Sonderfall desselben Kopiervorgangs. Die Frage ist also noch ungelöst.
Netch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.