Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 125 di 198] 

    

    MOVSD - Sposta un dato a 32 bit da un'area di memoria ad un'altra (tabella)
     
bulletQuesta istruzione non appartiene al Set dell'8088/86; si usa solo con 80386/486.
bulletIl suo compito è quello di spostare nel primo operando (destinazione, per default la locazione di memoria puntata da ES:DI il dato a 32 bit (doubleword) assunto per default dalla locazione di memoria puntata da DS:SI (sorgente).
bulletL'istruzione non ha operandi (la dimensione del dato da copiare è prefissata per default); 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 MOVSD 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):
         
        MOVSD   ES:[DI] << DS:[SI]   Sorgente  (dato a 32 bit)
 

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

MOVSD

 

no no 7 7 2 1                     
         
bulletLa tabella evidenzia che l'istruzione non modifica alcuna flag, ed essendo un'applicazione particolare della MOVS, pur non dichiarandoli esplicitamente, l'istruzione si accinge a spostare tra locazioni di memoria dati a 32 bit; in dettaglio:
bulletIl dato prelevato dalla locazione di memoria ha la dimensione di una doubleword.
bulletil segmento dell'area Destinazione è per default, ES e l'offset è per default DI.
bulletil segmento dell'area Sorgente è per default, DS e l'offset è per default SI
bullet non è possibile forzare (con l'override) registri di segmento diversi.
bulletdopo aver spostato il dato a 32 bit da una locazione all'altra aggiorna il valore dei entrambi i registri di offset (SI e DI), 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 4.
bulletse DF=1 (direzione indietro) ai puntatori viene sottratto 4.
bullet la presenza di operandi non è necessaria: la lettera D posta dopo lo mnemonico MOVS fa capire all'assemblatore che i dati da trattare sono a 32 bit.
bulletin tutti i casi non va dimenticato che questa istruzione usa per default i puntatori DS:SI e ES:DI, per cui è assolutamente necessario inizializzarli (insieme alla flag DF) prima di utilizzarli.
bulletQuesta potente istruzione esegue con un solo codice operativo il compito di 4 istruzioni, cioè equivale all'esecuzione del seguente codice:
         
MOV   EAX,DS:[SI]
MOV   ES:[DI],EAX
ADD   SI,4
ADD   DI,4
     
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 doublewords, CX, va caricato preventivamente.
bulletData l'utilità di questa tecnica viene proposto un esercizio d'esempio:
         

Addr

Codifica Masm

Istruzione

0100


010C
12345678
56789ABC
9ABCDEF0
00000000
00000000
00000000
Tab_1_32 DD 12345678H
         DD 56789ABCH
         DD 9ABCDEF0H
Tab_2_32 DD 00000000H
         DD 00000000H
         DD 00000000H
---- ---------------- ------- ----------------------
0118
0119
011D
0121
0124
0126
----
0128
0129
012D
0131
0134
FC
8D 36 0100
8D 3E 010C
B9 0003
66 A5
E2 FD
----------------
FC
8D 36 0100
8D 3E 010C
B9 0003
F3 66 A5




next:

-------




   REP
CLD
LEA SI,Tab_1_32
LEA DI,Tab_2_32
MOV CX,3
MOVSD
LOOP next
----------------------
CLD
LEA SI,Tab_1_32
LEA DI,Tab_2_32
MOV CX,3
MOVSD
         
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.
bulleti segment dei dati sorgente e destinazione sono impliciti, rispettivamente DS e ES.
bulleti dati trattati hanno la dimensione della doubleword, come si evince dalla direttiva DD, scritta dopo le etichette delle tabelle.
bulletil contatore CX è stato caricato con la dimensione della tabella, cioè il numero delle sue voci.
bulletl'azione del LOOP copia le doublewords del la prima tabella nella seconda, vuota; alla fine entrambe contengono gli stessi dati a 32 bit.
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 125 - MOVSD

    

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