|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
123
di 198] |
 |
|
MOVS - Sposta un dato da un'area di memoria
ad un'altra (stringa) |
|
 | Questa istruzione sposta
nel primo operando (destinazione, per default la locazione di memoria
puntata da ES:DI) il
dato assunto per default dalla locazione di memoria
puntata da DS:SI (sorgente). |
 | Per funzionare correttamente è necessario
specificare un operando sorgente, di solito l'etichetta
del primo dei dati da trasferire nella locazione puntata da DS:SI; in questo
modo l'assemblatore è in grado di stabilire la dimensione del dato
da assumere dalla memoria; se l'operando non viene aggiunto l'assemblatore segnala errore. |
 | Naturalmente se si desidera specificare anche l'etichetta
della locazione in cui trasferire il primo dei dati, la dimensione
deve essere coerente con quella sorgente, cioè un byte,
una word o una doubleword (con processori
80386/486). |
 | Nonostante la necessità di dichiarare
l'operando sorgente (solo per motivi di corretta compilazione) i dati sono
comunque assunti
dalla locazione puntata da DS:SI
e spostati in ES:DI, per
cui l'uso di questa istruzione ha senso solo se, in precedenza, entrambi i
registri puntatori, SI e DI,
sono stati inizializzati con le rispettive etichette specificate come
operandi,
per esempio anticipando la MOVS
ES:Testo11,Testo01
con LEA
SI,Testo01 e LEA
DI,Testo11 , vedi esempio successivo). |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
MOVS Destinazione,Sorgente |
ES:[DI] << DS:[SI] |
| |
|
Esempio
di Applicazione |
Cicli
di Clock |
Mem
Acces |
N°
Bytes |
Flag
influenzate |
| Mnemonico |
Operandi |
86 |
268 |
386 |
486 |
O |
D |
I |
T |
S |
Z |
A |
P |
C |
MOVS
|
ES:[Depo01],[Depo11]
|
18 |
5 |
7 |
7 |
2 |
1 |
|
|
|
|
|
|
|
|
|
MOVS
|
ES:[Depo02],[Depo12]
|
26 |
 | La tabella evidenzia che l'istruzione non
modifica alcuna flag. La figura seguente mostra le risorse
richieste da questa istruzione in funzione degli operandi
coinvolti (leggi le
istruzioni)
e sottolinea l'assoluta indipendenza del
codice generato dalle etichette
delle zone di memoria coinvolte, necessarie solo per evitare segnalazioni
d'errore da parte dell'assemblatore: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0101
0102
0104
0106
010A |
|
55
AA
55AA
AA55
55AA1188
118855AA |
|
.386p
Depo01
DB 55H
Depo11
DB 0AAH
Depo02 DW 55AAH
Depo12 DW 0AA55H
Depo04 DD 55AA1188H
Depo14 DD 118855AAH |
| ---- |
|
---------------- |
|
------ |
--------------------------------------------- |
010E
010F
0110
0112
0113
0114
0116
0118
011A
011D
011F
0121
0124
0126
0128 |
|
A4
A5
66 A5
A4
A5
66 A5
2E A4
2E A5
66 2E A5
36 A4
36 A5
66 36 A5
26 A4
26 A5
66 26 A5 |
|
|
MOVS ES:[DI],Byte Ptr [SI]
MOVS Word Ptr ES:[DI],Word Ptr WORD PTR [SI]
MOVS DWord Ptr ES:[DI],DWord Ptr [SI]
MOVS
ES:[Depo01],[Depo11]
MOVS ES:[Depo02],[Depo12]
MOVS ES:[Depo04],[Depo14]
MOVS ES:[Depo01],CS:[Depo11]
MOVS ES:[Depo02],CS:[Depo12]
MOVS ES:[Depo04],CS:[Depo14]
MOVS ES:[Depo01],SS:[Depo11]
MOVS ES:[Depo02],SS:[Depo12]
MOVS ES:[Depo04],SS:[Depo14]
MOVS ES:[Depo01],ES:[Depo11]
MOVS ES:[Depo02],ES:[Depo12]
MOVS ES:[Depo04],ES:[Depo14] |
|
 | E' interessante osservare che, comunque sia scritta,
al netto dell'eventuale byte di override, viene
sempre codificata con il byte A4 (se
tratta bytes) o A5
(se tratta word). |
 | Riassumendo, in dettaglio l'istruzione si
comporta in questo modo:
 | Il dato prelevato dalla locazione di
memoria ha la dimensione di un byte,
di una word o di
una doubleword. |
 | il segmento
dell'area Destinazione è
per default, ES e l'offset è per
default DI; non è possibile
forzare un altro registro di segmento ed è necessario scrivere
esplicitamente l'override
ES:, per evitare
che l'assemblatore creda che si voglia coinvolgere DS:
(in altre occasioni assunto per default, se manca altra indicazione). |
 | il segmento
dell'area Sorgente è
per default, DS e l'offset è per
default SI; è possibile
forzare un altro registro di segmento, con l'override. |
 | per questo è assolutamente necessario inizializzare
tutti i registri coinvolti (insieme alla flag DF)
prima di utilizzarli. |
 | dopo aver spostato il dato da una
locazione all'altra
aggiorna il valore dei entrambi i registri di offset (SI o ESI
e DI o EDI),
in funzione del valore della flag di direzione DF
(che va quindi predisposta con certezza
prima di iniziare il
confronto):
 | se DF=0
(direzione in avanti) ai puntatori viene sommato 1 (cioè sono
incrementati, se l'operando è un byte), 2 (se è una
word) o 4
(se ha dimensione doubleword). |
 | se DF=1
(direzione indietro) ai puntatori viene sottratto 1
(cioè sono decrementati, se l'operando è un byte), 2 (se è una
word) o 4 (se ha dimensione doubleword). |
|
 | la presenza dell'operando
sorgente è richiesta dalla sintassi
per consentire all'assemblatore di capire la dimensione
dei dati da trattare; esso deve dunque essere dichiarato con la specifica della
dimensione dei dati a cui fanno riferimento (Byte o
Word o Dword Ptr).
|
 | l'assemblatore compila comunque questa istruzione con il medesimo unico byte di
codice operativo con cui tratta le istruzioni da essa derivate, tutte
prive di operando, cioè MOVSB,
se i dati manipolati sono bytes, MOVSW
se sono word, o MOVSD se doubleword.
|
|
 | Questa potente istruzione esegue con un solo
codice operativo il compito di 4 istruzioni, cioè equivale all'esecuzione del seguente codice: |
MOV
AL,DS:[SI]
MOV ES:[DI],AL
INC SI
INC DI |
 | Prima di concludere è opportuno sottolineare che questa
istruzione può fruire dell'operatore di autoripetizione REP: anteponendolo al suo mnemonico il processo di
spostamento dati viene ripetuto automaticamente CX
volte, con
conseguente copia automatica di tutta l'area sorgente di memoria;
naturalmente il numero di coppie di dati, CX, va
caricato preventivamente. |
 | Data l'utilità di questa tecnica viene proposto un
esercizio d'esempio: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0112 |
|
20 45 73 65 6D 70
69 6F 20 64 69 20
54 65 73 74 6F 20
20 20 20 20 20 20
20 20 20 20 20 20
20 20 20 20 20 20 |
|
Testo01 DB " Esempio di Testo "
Testo11 DB "
" |
| ---- |
|
---------------- |
|
------- |
---------------------- |
0124
0125
0129
012D
0130
0131
----
0133
0134
0138
013C
013F |
|
FC
8D 36 0100
8D 3E 0112
B9 0012
A4
E2 FD
----------------
FC
8D 36 0100
8D 3E 0112
B9 0012
F3 A4 |
|
next:
-------
REP |
CLD
LEA SI,Testo01
LEA DI,Testo11
MOV CX,18
MOVS ES:Testo11,Testo01
LOOP next
----------------------
CLD
LEA SI,Testo01
LEA DI,Testo11
MOV CX,18
MOVS ES:Testo11,Testo01 |
|
 | L'analisi del codice suggerisce queste considerazioni:
 | la presenza dell'istruzione CLD
impone la lettura della memoria in avanti. |
 | per inizializzare gli offset SI
e DI dei puntatori si è fatto uso l'uso dell'istruzione LEA. |
 | il segment dei dati sorgente
si ritiene quello di default, DS (e
quindi può non essere scritto esplicitamente). |
 | il segment delle locazioni destinazione si ritiene quello di default,
ES
(e quindi deve essere scritto esplicitamente). |
 | il contatore CX è stato caricato con la dimensione
della stringa, cioè il numero dei suoi caratteri. |
 | l'azione del LOOP
copia la prima stringa nella seconda, vuota; alla fine entrambe
contengono lo stesso messaggio. |
|
 | Per confrontare i bytes compilati dall'assemblatore viene
proposta anche la versione che utilizza il prefisso REP. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|