|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
183
di 198] |
 |
|
STOS - Copia
l'accumulatore in un'area di memoria. |
|
 | Questa istruzione copia
il contenuto dell'accumulatore nella locazione di memoria
puntata da ES:DI. |
 | Per funzionare correttamente è necessario
specificare un operando destinazione, di solito l'etichetta
del primo dei dati assunti dall'accumulatore; 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. |
 | In questo modo è chiara anche la dimensione
del registro (accumulatore) sorgente, cioè AL
se il dato assunto è un byte,o AX
se è una word o EAX
se è una doubleword (con processori 80386/486). |
 | Nonostante la necessità di dichiarare
l'operando sorgente (solo per motivi di corretta compilazione) i dati sono
comunque memorizzati nella locazione puntata da ES:DI, per
cui l'uso di questa istruzione ha senso solo se, in precedenza, il registro DI è stato inizializzato con l'etichetta usata come operando,
per esempio anticipando la STOS
ES:Testo01 con LEA
DI,Testo01, vedi esempio successivo. |
 | Da notare che la LODS
esegue il compito opposto della STOS. |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
STOS |
Destinazione
(ES:[DI]) << Sorgente (Accumulatore) |
|
|
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 |
STOS
|
[Depo01]
|
11 |
3 |
4 |
5 |
1 |
1 |
|
|
|
|
|
|
|
|
|
STOS
|
[Depo02]
|
15 |
 | La tabella evidenzia che l'istruzione non modifica
le 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 dall'etichetta
della zona di memoria coinvolta, necessaria solo per evitare segnalazioni
d'errore da parte dell'assemblatore: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0101
0103 |
|
55
55AA
55AA1188 |
|
.386p
Depo01
DB 55H
Depo02 DB
55AAH
Depo04 DD 55AA1188H |
| ---- |
|
---------------- |
|
------ |
--------------------------- |
0108
0109
010A
010C
010D
010E
0110
0111
0112 |
|
AA
AB
66 AB
AA
AB
66 AB
AA
AB
66 AB |
|
|
STOS
Byte
Ptr ES:[DI]
STOS Word Ptr ES:[DI]
STOS Dword Ptr ES:[DI]
STOS ES:Depo01
STOS ES:Depo02
STOS ES:Depo04
STOS ES:[Depo01]
STOS ES:[Depo02]
STOS ES:[Depo04] |
|
 | Riassumendo, in dettaglio l'istruzione si
comporta in questo modo:
 | Il dato prelevato dall'accumulatore 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, con l'override. |
 | dopo aver prelevato il dato dall'accumulatore
aggiorna il valore del registro di offset (DI o
DSI),
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) al puntatore viene sommato 1 (cioè viene
incrementato, se l'operando è un byte), 2 (se è una
word) o 4
(se ha dimensione doubleword). |
 | se DF=1
(direzione indietro) al puntatore viene sottratto 1
(cioè viene decrementato, se l'operando è un byte), 2 (se è una
word) o 4 (se ha dimensione doubleword). |
|
 | la presenza dell'operando è 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è STOSB,
se i dati manipolati sono bytes, STOSW
se sono word, o STOSD se doubleword.
|
|
 | Questa potente istruzione esegue con un solo
codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice: |
 | Prima 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, data l'impossibilità di "aggiornare" il dato
assunto in AL prima del giro
successivo, la memoria coinvolta viene riempita (fill)
con il medesimo dato, rendendo piuttosto
particolare l'uso dell' auto ripetizione!;
per il
corretto uso dei questo prefisso è dunque necessario caricare
preventivamente CX con il numero di
trasferimenti da eseguire. |
 | Viene proposto un
esercizio d'esempio: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
|
0100 |
|
20 45
73 65 6D 70
69 6F 20 64 69 20
54 65 73 74 6F 20 |
|
Testo01 DB " Esempio di Testo " |
| ---- |
|
---------------- |
|
------- |
---------------------- |
0112
0113
0117
0119
011C
011D
----
011F
0120
0124
0126
0129
|
|
FC
8D 3E 0100
B0 2A
B9 0012
AA
E2 FD
-----------------
FC
8D 3E 0100
B0 2A
B9 0012
F3 AA |
|
next:
-------
REP |
CLD
LEA DI,Testo01
MOV AL,'*'
MOV CX,18
STOS ES:Testo01
LOOP next
----------------------
CLD
LEA DI,Testo01
MOV AL,'*'
MOV CX,18
STOS ES:Testo01 |
|
 | L'analisi del codice suggerisce queste considerazioni:
 | la presenza dell'istruzione CLD
impone la lettura della memoria in avanti. |
 | per inizializzare l'offset DI
del puntatore si è fatto uso l'uso dell'istruzione LEA. |
 | il segment si ritiene quello di default, ES,
e non può essere cambiato con l'override
ES. |
 | il contatore CX è stato caricato con la dimensione
della stringa da riempire, cioè con il numero dei suoi caratteri |
 | l'azione del LOOP
riempie la stringa Testo01 di asterischi, '*'. |
|
 | Per confrontare i bytes compilati dall'assemblatore viene
proposto anche un breve codice con il prefisso REP. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|