Perché le istruzioni per la copia di solito si chiamano MOV?

22

In molti assemblatori, un'istruzione di copia del valore è solitamente denominata "MOV" e la sua descrizione nei manuali di solito contiene anche "move" (tuttavia, è possibile utilizzare altre parole, come "load", "store", "extract" , ecc.) È raro trovare ISA ) che non segue questa convenzione.

D'altra parte, in altri contesti, "move" differisce da "copy" nel senso che source è distrutta (ad esempio "mv" vs. "cp" in Unix, Move [F6] in Norton Commander e cloni, ecc.) La" mossa "di Assembler ha davvero" copia "semantica, mantenendo intatto il valore di origine.

Ho scoperto che questo è iniziato almeno da quando IBM 1401 (1959), ma IBM 360 usato questa parola solo per la copia in-storage, ma non per le operazioni tra registri e storage (che utilizzava" load "e" memorizzare"). Ma perché è ancora ampiamente utilizzato e non sostituito con "copia" o "negozio"?

    
posta Netch 24.12.2013 - 12:23
fonte

3 risposte

10

In alcuni set di istruzioni, esistono istruzioni distinte per caricare un registro dalla memoria, memorizzare un registro in memoria o trasferire elementi tra registri. Mentre alcune forme di linguaggio assembly usano il verbo "load" per tutto (es. I mnemonici Z80 di Zilog usano ld a,(1234h) , ld (1234h),a e ld a,b ), e alcuni usano il "T" ransfer (es. Il 6502 con TXA per "trasferimento X a A "), alcuni usano" move "per le operazioni regster-to-register per distinguerli da carichi e negozi. Se uno ha un formato di istruzione come il 68000 che usa la stessa forma di istruzione generale per le operazioni da registro a registro, da registro a memoria, da memoria a registro e anche da memoria a memoria, il verbo "spostare" è probabilmente un verbo generico migliore di qualsiasi altra alternativa.

Non ho idea di set di istruzioni per minicomputer o mainframe prima dell'8080, ma l'8080 usava "load" e "store" per la maggior parte delle istruzioni di accesso alla memoria e "mov" per le istruzioni register-to-register, ma la maggior parte delle istruzioni che potrebbe operare su un registro arbitrario a 8 bit potrebbe anche operare su "M", che era la posizione di memoria indirizzata da HL, quindi un "MOV" verso o da "M" si comporterebbe effettivamente come un carico o archivio.

Per quanto riguarda la distinzione tra "copia" e "sposta", sospetto che ciò abbia molto a che fare con il fatto che il codice non può né creare né distruggere registri; loro esistono e basta Nel descrivere il comportamento della sequenza di codice mov bx,ax / mov ax,1234 , ha più senso dire la prima istruzione copia da bx a axe la seconda istruzione distrugge il valore in ax e lo sostituisce con il valore 1234, oppure lo fa più senso vedere la prima istruzione come se avesse spostato il valore da bx ad ax (rendendo il valore in ax un "do not care"), e la seconda istruzione carica ascia (che non era stata curata) con 1234? A volte i registri sorgente sono ancora significativi dopo un'istruzione di trasferimento del registro, ma poiché non c'è nulla nell'insieme di istruzioni che indichi se lo sarà, e in molte situazioni comuni non lo è, "spostare" sembra ragionevole.

    
risposta data 24.12.2013 - 18:17
fonte
0

Hai certamente ragione. La maggior parte se non tutte le istanze di un'istruzione mov sono in realtà una copia.

Alcuni in realtà non hanno nemmeno un mov è un'istruzione pseudo per

add dest=source+zero.

Comprendi anche che la sintassi ascii è arbitraria, il codice macchina significa qualcosa ed è definito e corretto per quel processore. La maggior parte se non sempre il creatore / fornitore del processore crea una sintassi in parte per definire il set di istruzioni (codice macchina) e in parte per definire una sintassi che funziona con uno strumento che ha anche creato o commissionato per convertire quel linguaggio assembly in macchina codice per il loro processore. Puoi certamente per esempio entrare nell'assembler di GNU (che ha la tendenza a fare le sue cose e non seguire comunque la sintassi dei processori dei processori) e aggiungere una pseudo istruzione di copia.

Casi d'uso: in questi giorni la maggior parte del codice di linguaggio assembly è generato dal compilatore, e l'istruzione mov viene spesso utilizzata per spostare un valore da un registro all'altro in modo che il registro sorgente (posizione memoria, ecc.) possa essere Usato. Per ragioni della convenzione di chiamata per quel processore o perché alcune istruzioni o insiemi di istruzioni non sono ortogonali, quindi è necessario spostare le cose. Certamente ci sono momenti in cui una copia di un valore è desiderata e il mov può essere usato per fare quella copia.

Dubito seriamente che sapremo mai quale sia il singolo o il team che ha messo a punto il termine e perché hanno scelto di spostarsi sulla copia. Poiché ci siamo abituati, tendiamo a riutilizzarlo con ogni nuova serie di istruzioni. Come già menzionato, alcuni set di istruzioni utilizzano istruzioni di caricamento e memorizzazione basate sul registro in cui un operando è un registro e l'altro è un indirizzo e si muove solo per il registro per registrare i casi. E altri set di istruzioni usano mov per register o mem per entrambi gli operandi. Sebbene sia certamente possibile aggiungere una copia a qualsiasi / molti degli assemblatori open source, ottenere la trazione sul suo utilizzo sarà più difficile. Se lavori in un posto dove hai il controllo sulla sintassi originale (lavoro per un posto che crea un nuovo processore) dove puoi dettare il registro per registrare lo spostamento è chiamato copia, è probabile che tu finisca con l'assemblatore di gnu ad esempio includendo un mov dal momento che il livello di comfort è così elevato, qualcuno lo aggiungerà (e il gas spesso va contro la sintassi dei processori dei processori e fa la sua stessa cosa).

    
risposta data 02.01.2014 - 06:25
fonte
-4

Sostituire un'istruzione significa rompere la compatibilità a ritroso. Un assemblatore con la nuova sintassi non sarà in grado di assemblare il codice scritto con la vecchia sintassi - a meno che quel codice non usi quell'istruzione (e l'unico posto in cui vedrai un codice assembly che non usa MOV è in esempi di sintassi che mostrano altre istruzioni ...)

Generalmente i compilatori generano il codice assembly e lo passano automaticamente all'assembler, quindi dovranno essere modificati anche per adattarsi al nuovo assemblatore. Se una lingua consente l'assemblaggio in linea, il vecchio codice sorgente che utilizza le istruzioni assembler in linea con MOV non funzionerà più.

Quindi stiamo parlando di una gigantesca rottura del codice e per cosa? non renderà la lingua più leggibile, perché a differenza di alcuni linguaggi di alto livello non si ha la possibilità di dire cosa fa un assembly code senza conoscere l'assembly, e se si conosce l'assembly si sa cosa fa MOV .

Un costo enorme con guadagno zero spiega facilmente perché l'istruzione non è stata rinominata.

    
risposta data 24.12.2013 - 13:00
fonte

Leggi altre domande sui tag