|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
186
di 198] |
 |
|
STOSW - Copia
la Word AX in un'area di memoria. |
|
 | Questa istruzione trasferisce
nella locazione di memoria
puntata da ES:DI il dato a
16 bit
(byte), assunto per default da AX.
|
 | L'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 STOSW
con LEA
DI,Tab_16, vedi esempio successivo). |
 | Da notare che la LODSW
esegue il compito opposto della STOSW. |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
STOSW |
Destinazione (ES:[DI]) << Sorgente (AX) |
| |
|
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 |
STOSW
|
|
15 |
7 |
7 |
6 |
2 |
1 |
|
|
|
|
|
|
|
|
|
 | La 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 16
bit presenti nella locazione messa a confronto con l'accumulatore; in
dettaglio:
 | Il dato prelevato dall'accumulatore ha la
dimensione di una word.
|
 | 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),
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 2.. |
 | se DF=1
(direzione indietro) al puntatore viene sottratto 2. |
|
 | la presenza di
operandi non è necessaria: la lettera W
posta dopo lo mnemonico STOS fa
capire all'assemblatore che i dati da trattare sono a 16
bit. |
 | in 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. |
|
 | 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, per l'impossibilità di "aggiornare" il
dato a 16 bit (word)
assunto da AX 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. |
 | Viene proposto un
esercizio d'esempio: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
|
0100 |
|
0000
0000
0000 |
|
Tab_16
DW 0000H
DW 0000H
DW 0000H |
| ---- |
|
---------------- |
|
------- |
---------------------- |
0106
0107
010B
010E
0111
0112
----
0114
0115
0119
011C
011F |
|
FC
8D 3E 0100
B8 1000
B9 0003
AB
E2 FD
-----------------
FC
8D 3E 0100
B8 1000
B9 0003
F3 AB |
|
next:
-------
REP |
CLD
LEA DI,Tab_16
MOV AX,1000H
MOV CX,3
STOSW
LOOP next
----------------------
CLD
LEA DI,Tab_16
MOV AX,1000H
MOV CX,3
STOSW |
|
 | 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 tabella e il prefisso REP
provvederà a caricare automaticamente il medesimo dato, 1000H,
predisposto il AX, fino
all'esaurimento di tutti gli elementi. |
 | l'azione del LOOP
riempie la tabella Tab_16 di word
uguali a 1000H. |
|
 | 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
|