Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 123 di 198] 

    

    MOVS - Sposta un dato da un'area di memoria ad un'altra (stringa)
     
bulletQuesta 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).
bulletPer 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.
bulletNaturalmente 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).
bulletNonostante 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).
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
       MOVS Destinazione,Sorgente   ES:[DI] << DS:[SI]
 

Esempio di Applicazione

Cicli di Clock Mem
Acces

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
         
bulletLa 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]
          
bulletE' 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).
bulletRiassumendo, in dettaglio l'istruzione si comporta in questo modo:
bulletIl dato prelevato dalla locazione di memoria ha la dimensione di un byte, di una word o di una doubleword.
bulletil 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).
bulletil segmento dell'area Sorgente è per default, DS e l'offset è per default SI; è possibile forzare un altro registro di segmento, con l'override.
bulletper questo è assolutamente necessario inizializzare tutti i registri coinvolti (insieme alla flag DF) prima di utilizzarli.
bulletdopo 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):
bulletse 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).
bulletse 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).
bullet 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).
bulletl'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.
bulletQuesta 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
     
bulletPrima 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.
bulletData 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
         
bulletL'analisi del codice suggerisce queste considerazioni:
bulletla presenza dell'istruzione CLD impone la lettura della memoria in avanti.
bullet per inizializzare gli offset SI e DI dei puntatori si è fatto uso l'uso dell'istruzione LEA.
bulletil segment dei dati sorgente si ritiene quello di default, DS (e quindi può non essere scritto esplicitamente).
bulletil segment delle locazioni destinazione si ritiene quello di default, ES (e quindi deve essere scritto esplicitamente).
bulletil contatore CX è stato caricato con la dimensione della stringa, cioè il numero dei suoi caratteri.
bulletl'azione del LOOP copia la prima stringa nella seconda, vuota; alla fine entrambe contengono lo stesso messaggio.
bulletPer confrontare i bytes compilati dall'assemblatore viene proposta anche la versione che utilizza il prefisso REP.

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 123 - MOVS

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati