Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 185 di 198] 

    

    STOSD - Copia la Doubleword EAX in un'area di memoria.
     
bulletQuesta istruzione non appartiene al Set dell'8088/86; si usa solo con 80386/486.
bulletIl suo compito è quello di trasferire nella locazione di memoria puntata da ES:DI  il dato a 32 bit (byte), assunto per default da EAX.
bulletL'istruzione non ha operandi (la dimensione del dato da scrivere in memoria è prefissata per default) ma, per il suo corretto funzionamento, è necessario comunque inizializzare il registro DI con l'etichetta associata alla memoria in cui stoccare i dati, per esempio anticipando la STOSD con LEA DI,Tab_32, vedi esempio successivo).
bulletDa notare che la LODSD esegue il compito opposto della STOSD.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
   STOSD   Destinazione (ES:[DI]) << Sorgente (EAX)
 

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

STOSD

 

15 7 7 6 2 1                  
         
bulletLa tabella evidenzia che l'istruzione non modifica le flag e che è priva di operandi: in realtà, essendo un'applicazione particolare della STOS, pur non dichiarandoli esplicitamente l'istruzione coinvolge i dati a 32 bit presenti nella locazione messa a confronto con l'accumulatore;  in dettaglio:
bulletIl dato prelevato dall'accumulatore ha la dimensione 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, con l'override.
bulletdopo aver prelevato il dato dall'accumulatore aggiorna il valore del registro di offset (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) al puntatore viene sommato 4..
bulletse DF=1 (direzione indietro) al puntatore viene sottratto 4.
bullet la presenza di operandi non è necessaria: la lettera D posta dopo lo mnemonico STOS 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 il puntatore ES:DI, per cui è assolutamente necessario inizializzarlo (insieme alla flag DF) prima di utilizzarle.
bulletQuesta potente istruzione esegue con un solo codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice:
     
MOV   ES:[DI],EAX
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 copia dall'accumulatore viene ripetuto automaticamente CX volte, con conseguente scrittura automatica di tutta l'area di memoria; è tuttavia curioso notare che, per l'impossibilità di "aggiornare" il dato a 32 bit (doubleword) assunto da EAX prima del giro successivo, la memoria coinvolta viene riempita (fill) con il medesimo valore, rendendo piuttosto particolare l'uso dell' auto ripetizione!; per il corretto uso dei questo prefisso è comunque necessario caricare preventivamente CX con il numero di trasferimenti da eseguire.
bulletViene proposto un esercizio d'esempio:
     

Addr

Codifica Masm

Istruzione

0100 00000000
00000000
00000000
Tab_32  DD 00000000H
        DD 00000000H
        DD 00000000H    
---- ---------------- ------- ----------------------
010C
010D
0111
0117
011A
011C
----
011E
011F
0123
0129
012C
FC
8D 3E 0100
66 B8 12345678
B9 0003
66 AB
E2 FC
-----------------
FC
8D 3E 0100
66 B8 12345678
B9 0003
F3 66 AB




next:

-------




   REP
CLD
LEA    DI,Tab_32
MOV    EAX,1000H
MOV    CX,3
STOSD
LOOP   next
----------------------
CLD
LEA    DI,Tab_32
MOV    EAX,1000H
MOV    CX,3
STOSD
     
bulletL'analisi del codice suggerisce queste considerazioni:
bulletla presenza dell'istruzione CLD impone la lettura della memoria in avanti.
bullet per inizializzare l'offset DI del puntatore si è fatto uso l'uso dell'istruzione LEA.
bulletil segment si ritiene quello di default, ES, e non può essere cambiato con l'override ES.
bulletil contatore CX è stato caricato con la dimensione della tabella e il prefisso REP provvederà a caricare automaticamente il medesimo dato, 12345678H, predisposto il EAX, fino all'esaurimento di tutti gli elementi.
bulletl'azione del LOOP riempie la tabella Tab_32 di doubleword uguali a 12345678H.
bulletPer confrontare i bytes compilati dall'assemblatore viene proposto anche un breve codice con 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 185 - STOSD

    

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