Perché l'istruzione di copiatura di solito si chiama MOV?


23

In parecchi assemblatori, un'istruzione per la copia di valori viene generalmente 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 un ISA ) che non segue questa convenzione.

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

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


5
Wikipedia dice : "La parola mossa per questa operazione è, in senso stretto, un termine improprio: ha poco a che fare con il concetto fisico di spostare un oggetto da A a B, con il posto A che diventa vuoto; un MOV invece fa una copia di lo stato dell'oggetto in A e sovrascrive il vecchio stato di B. in questo processo. Ciò si riflette in alcuni altri linguaggi di assemblaggio usando parole come load , store o copy invece di move. ".
Uwe Keim,

@UweKeim hmm, ho cercato su Google una spiegazione prima della domanda ma non sono stato nutrito con questo articolo. Comunque, questo spiega lo stato attuale, ma non fornisce un indizio per le origini reali ...
Netch

2
@gnat Intendevo "Instruction Set Architecture", non un bus ISA. L'ho rieditato.
Netch

@ Grazie grazie! In qualche modo sono riuscito a perderlo in un ampio elenco di chiarimenti su Wikipedia
moscerino

1
Dubito che ci sia modo di scoprire perché originariamente si chiamava "mossa" anziché "copia", ma speculare è divertente. Nella pagina di Wikipedia per il linguaggio assembly , descrive MOV come un'operazione per "spostare una copia dei dati", che è un'interpretazione interessante. Un'altra possibilità è che in termini di utilizzi effettivi di MOV, l'operazione è concettualmente un movimento di dati; che non ci importa più della fonte.
Ben Lee,

Risposte:


10

In alcuni set di istruzioni, esistono istruzioni distinte per caricare un registro dalla memoria, memorizzare un registro nella memoria o trasferire cose tra i registri. Mentre alcuni moduli di linguaggio assembly usano il verbo "load" per tutto (ad es. Uso di mnemonici Z80 di Zilog ld a,(1234h), ld (1234h),ae ld a,b), e alcuni usano il trasferimento "T" (ad es. 6502 con TXA per "trasferire X in A"), altri usano "sposta" per le operazioni da registratore a registro per distinguerle da carichi e magazzini. Se uno ha un formato di istruzioni come il 68000 che utilizza lo stesso modulo di istruzioni generali per le operazioni da registro a registro, da registro a memoria, da memoria a registro e persino da memoria a memoria, il verbo "sposta" è probabilmente un migliore verbo di uso generale rispetto a qualsiasi altra alternativa.

Non ho idea dei set di istruzioni per minicomputer o mainframe precedenti all'8080, ma l'8080 usava "load" e "store" per la maggior parte delle istruzioni di accesso alla memoria e "mov" per le istruzioni da registro a registro, ma la maggior parte delle istruzioni che potevano funzionare su un registro a 8 bit arbitrario potrebbe anche operare su "M", che era la posizione di memoria indirizzata da HL, quindi un "MOV" verso o da "M" si sarebbe effettivamente comportato come un carico o un 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; esistono appena. Nel descrivere il comportamento della sequenza di codice mov bx,ax / mov ax,1234, ha più senso dire che la prima istruzione copia bx in ax, e la seconda istruzione distrugge il valore axe lo sostituisce con il valore 1234, o ha più senso vedere la prima istruzione come aver spostato il valore da bx ad ax (rendendo il valore in ax un "non importa"), e la seconda istruzione carica ax (che era stata non importa) con 1234? A volte i registri di origine sono ancora significativi dopo un'istruzione di trasferimento del registro, ma poiché non c'è nulla nel set di istruzioni per indicare se lo sarà


Non ho prove a sostegno della tua risposta, ma sicuramente suona bene. Le operazioni di caricamento / archiviazione prenderanno un percorso diverso nella CPU / nel microcodice a causa dell'accesso alla memoria / cache, ma lo spostamento tra i registri potrebbe essere un ciclo singolo (non è necessario attendere altre fasi della pipeline) e quindi vale la pena differenziarlo. Ma questo non spiega move-vs-copy ...
JBR Wilkinson,

Concordato. Considerare ad esempio i dispositivi di input mappati in memoria. La lettura di un percorso di origine può modificarlo, ad esempio scartando l'elemento letto da una coda hardware, sostituendolo con l'elemento in coda successivo. Sembra una mossa piuttosto che una copia: la fonte non contiene più tali informazioni, solo la destinazione. E quel comportamento non è deciso dalla CPU, è deciso da quel dispositivo mappato in memoria.
Steve314,

I linguaggi di assemblaggio utilizzano mnemonici "incentrati sulla CPU". Cioè, tutto è chiamato dal punto di vista dei registri della CPU. Pertanto, "load" di solito copia un valore in un registro, mentre "store" di solito ne copia uno da un registro alla memoria. Cosa chiamare quindi copiare un valore da un registro all'altro? "Sposta" è una scelta ovvia. Se la stessa operazione di microcodice esegue entrambe (come nel 68000), "sposta" è una scelta più generica per il caricamento / archiviazione. "Copia" avrebbe potuto essere utilizzato ma potrebbe essere ridondante poiché non esiste una vera "mossa", in cui l'origine viene lasciata vuota.
DocSalvager,

@DocSalvage: se un registro a 32 bit è un insieme fisso di 32 flip flop o latch che esisterà sempre, "spostare" non ha necessariamente senso. Nelle architetture con la ridenominazione dei registri, tuttavia, un operando "move" che invaliderebbe anche la fonte potrebbe migliorare l'efficienza liberando un registro virtuale. Non ho mai sentito parlare di una cosa del genere, ma non conosco architetture progettate pensando alla ridenominazione del registro.
supercat

@supercat: nell'hardware del computer, tutti i registri e tutte le posizioni di memoria contengono un valore in ogni momento. In realtà non esiste nulla come "null" o "vuoto". Usiamo convenzioni arbitrarie per indicare quando il contenuto del registro o della memoria non è valido. Molto spesso, lasciamo che "0" significhi "null" ma non sempre. Lo stato "null" di un blocco di memoria, ad esempio, può essere indicato dagli indirizzi iniziale e finale memorizzati in un'altra posizione. Esistono anche molte altre tecniche. In definitiva, la mnemonica del linguaggio è arbitraria sebbene cerchiamo l'opzione più ampiamente compresa.
DocSalvager,

0

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

Alcuni non hanno nemmeno un mov per cui è una pseudo istruzione

add dest=source+zero.

Comprendi anche che la sintassi ASCII è arbitraria, il codice macchina significa qualcosa ed è definito e risolto per quel processore. La maggior parte, se non tutte le volte, 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 di assemblaggio in macchina codice per il loro processore. Ad esempio, puoi certamente andare nell'assemblatore gnu (che ha la tendenza a fare le sue cose e non seguire comunque la sintassi dei fornitori di processori) e aggiungere una pseudo istruzione di copia.

Casi d'uso: al giorno d'oggi la maggior parte del codice del linguaggio assembly viene generato dal compilatore e l'istruzione mov viene spesso utilizzata per spostare effettivamente un valore da un registro all'altro in modo che il registro di origine (posizione di memoria, ecc.) Possa essere riutilizzato. Per motivi della convenzione di chiamata per quel processore o perché alcune istruzioni o set di istruzioni non sono ortogonali, quindi è necessario spostare le cose. Certamente ci sono momenti in cui si desidera una copia di un valore e il mov può essere usato per fare quella copia.

Dubito seriamente che sapremo mai quale individuo o squadra ha escogitato il termine per primo e perché hanno scelto di spostarsi sulla copia. Poiché ci siamo abituati, tendiamo a riutilizzarlo con ogni nuovo set di istruzioni. Come già accennato, alcuni set di istruzioni utilizzano il caricamento basato su registro e memorizzano le istruzioni in cui un operando è un registro e l'altro è un indirizzo e si sposta solo per il registro per registrare i casi. E altri set di istruzioni usano mov per register o mem per entrambi gli operandi. Anche se puoi sicuramente aggiungere una copia a uno / molti degli assemblatori open source, ottenere una trazione sul suo utilizzo sarà più difficile. Se lavori da qualche parte in cui hai il controllo sulla sintassi originale (lavora per un posto creando un nuovo processore) dove puoi dettare il registro per registrare lo spostamento si chiama copia,


-4

Sostituire un'istruzione significa interrompere la compatibilità con le versioni precedenti. 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 dove vedrai un codice di assemblaggio che non usa MOVè negli esempi di sintassi che mostrano altre istruzioni ...)

I compilatori di solito generano il codice assembly e lo passano automaticamente all'assemblatore, quindi dovranno essere modificati anche per adattarsi al nuovo assemblatore. Se una lingua consente l'assemblaggio inline, il vecchio codice sorgente che utilizza l'assemblatore inline con le MOVistruzioni non funzionerà più.

Quindi, stiamo parlando di una gigantesca violazione del codice, e per cosa? non renderà la lingua più leggibile, perché a differenza di un linguaggio di alto livello non hai alcuna possibilità di dire cosa fa un codice assembly senza conoscere assembly, e se conosci assembly sai cosa MOVfa.

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


3
come risponde alla domanda posta?
moscerino

2
L'unica frase che termina con un punto interrogativo è "Ma perché è ancora ampiamente usata e non sostituita con" copia "o" store "? '.
Idan Arye,

2
Non spiega perché l'istruzione sia stata nominata tale per cominciare, da innumerevoli ISA progettati da zero (cioè senza vincoli di compatibilità all'indietro) per molti decenni. Inoltre, se un fornitore volesse cambiare il mnemonico nonostante la retrocompatibilità, potrebbe fornire un alias e promuoverne l'uso.

1
Cosa significa "OP"? E non ho visto una vera spiegazione.
Netch

1
Sono il poster originale e indicherò che la copia tra celle di memoria in S / 360 non è "un'operazione leggermente diversa" ma è solo un caso speciale della stessa copia. La domanda è ancora irrisolta.
Netch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.