Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 100 di 198] 

    

    LODS - Assume un dato da un'area di memoria (stringa)
     
bulletQuesta istruzione trasferisce nel primo operando (destinazione, per default l'accumulatore) il dato assunto dalla locazione di memoria puntata da DS:SI.
bulletPer 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.
bulletIn 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).
bulletNonostante 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).
bulletDa notare che la STOS esegue il compito opposto della LODS.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
       LODS Memoria   Destinazione (Accumulatore) << Sorgente  (dato)
 

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

LODS

[Depo01]

12 5 5 5 1 1                     

LODS

[Depo02]

16
         
bulletLa 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]
          
bulletRiassumendo, in dettaglio l'istruzione si comporta in questo modo:
bulletIl dato prelevato dalla locazione di memoria ha la dimensione di un byte, di una word o di una doubleword.
bulletil 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.
bulletdopo 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):
bulletse 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).
bulletse 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).
bullet 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).
bulletl'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.
bulletQuesta potente istruzione esegue con un solo codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice:
         
MOV   AL,DS:[SI]
INC   SI
     
bulletPrima 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!
bulletData 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
         
bulletL'analisi del codice suggerisce queste considerazioni:
bulletla presenza dell'istruzione CLD impone la lettura della memoria in avanti.
bullet per inizializzare l'offset SI del puntatore si è fatto uso l'uso dell'istruzione LEA.
bulletil segment si ritiene quello di default, DS.
bulletil contatore CX è stato caricato con la dimensione della stringa, cioè il numero dei suoi caratteri
bulletla procedura BIOchr1 appartiene alla libreria Giobe.ASM/LIB, dell'ambiente Assembler, ed è qui dichiarata EXTRN
bulletl'azione del LOOP e della BIOchr1 stampa a video la stringa Testo01
bulletPer 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...

    

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 100 - LODS

    

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