|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
100
di 198] |
 |
|
LODS - Assume
un dato da un'area di memoria (stringa) |
|
 | Questa istruzione trasferisce
nel primo operando (destinazione, per default l'accumulatore) il
dato assunto dalla locazione di memoria
puntata da DS:SI. |
 | Per funzionare correttamente è necessario
specificare un operando sorgente, di solito l'etichetta
del primo dei dati da trasferire in 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) di destinazione, cioè AL
se il dato letto è un byte, AX
se word e EAX
se doubleword (con processori 80386/486). |
 | Nonostante la necessità di dichiarare
l'operando sorgente (solo per motivi di corretta compilazione) i dati sono
comunque assunti
dalla locazione puntata da DS:SI, per
cui l'uso di questa istruzione ha senso solo se, in precedenza, il registro
SI è stato inizializzato con l'etichetta usata come operando,
per esempio anticipando la LODS
Testo01
con LEA
SI,Testo01, vedi esempio successivo). |
 | Da notare che la STOS
esegue il compito opposto della LODS. |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
LODS Memoria |
Destinazione (Accumulatore) << Sorgente (dato) |
| |
|
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 |
LODS
|
[Depo01]
|
12 |
5 |
5 |
5 |
1 |
1 |
|
|
|
|
|
|
|
|
|
LODS
|
[Depo02]
|
16 |
 | La 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 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 DW 55AAH
Depo04 DD 55AA1188H |
| ---- |
|
---------------- |
|
------ |
--------------------------------------------- |
0108
0109
010A
010C
010E
0110
0113
0115
0117 |
|
AC
AD
66 AD
2E AC
2E AD
66 2E AD
26 AC
26 AD
66 26 AD |
|
|
LODS
Byte
Ptr DS:[SI]
LODS Word Ptr DS:[SI]
LODS Dword Ptr DS:[SI]
LODS CS:Depo01
LODS CS:Depo02
LODS CS:Depo04
LODS ES:[Depo01]
LODS ES:[Depo02]
LODS ES:[Depo04] |
|
|
 | Riassumendo, in dettaglio l'istruzione si
comporta in questo modo:
 | Il dato prelevato dalla locazione di
memoria ha la dimensione di un byte,
di una word o di
una doubleword. |
 | il segmento
dell'area Dati è
per default, DS e l'offset è per
default SI;
per questo è assolutamente necessario inizializzare i registri (insieme alla flag DF)
prima di utilizzarle; è possibile
forzare un altro registro di segmento, con l'override. |
 | dopo aver spostato il dato in accumulatore
aggiorna il valore del registro di offset (SI o ESI),
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è LODSB,
se i dati manipolati sono bytes, LODSW
se sono word, o LODSD 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
acquisizione dati (a 8 bit, bytes)
viene ripetuto automaticamente CX, da
caricare preventivamente, con
conseguente lettura automatica di tutta l'area di memoria; è tuttavia curioso
notare che, data l'impossibilità di "consumare" il dato
assunto in AL prima del giro
successivo, esso viene sovrascritto, cioè
inesorabilmente perso, rendendo
inutile l'uso dell'autoripetizione! |
 | Data l'utilità di questa tecnica 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 |
|
EXTRN BIOchr1:NEAR
Testo01 DB " Esempio di Testo " |
| ---- |
|
---------------- |
|
------- |
---------------------- |
0113
0114
0118
011B
011C
011F
----
0121
0122
0126
0129 |
|
FC
8D 36 0100
B9 0012
AC
E8 XXXX
E2 FA
----------------
FC
8D 36 0100
B9 000A
F3 AC |
|
next:
-------
REP |
CLD
LEA SI,Testo01
MOV CX,18
LODS Testo01
CALL BIOchr1
LOOP next
----------------------
CLD
LEA SI,Testo01
MOV CX,10
LODS Testo01 |
|
 | L'analisi del codice suggerisce queste considerazioni:
 | la presenza dell'istruzione CLD
impone la lettura della memoria in avanti. |
 | per inizializzare l'offset SI
del puntatore si è fatto uso l'uso dell'istruzione LEA. |
 | il segment si ritiene quello di default, DS. |
 | il contatore CX è stato caricato con la dimensione
della stringa, cioè il numero dei suoi caratteri |
 | la procedura
BIOchr1
appartiene alla libreria
Giobe.ASM/LIB, dell'ambiente Assembler, ed è qui
dichiarata EXTRN |
 | l'azione del LOOP e
della
BIOchr1 stampa a video la
stringa Testo01 |
|
 | Per confrontare i bytes compilati dall'assemblatore viene
proposto anche un breve codice con l'inutile prefisso REP:
l'azione di lettura è ripetuta automaticamente, ma i dati sono tutti
perduti... |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|