Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 183 di 198] 

    

    STOS - Copia l'accumulatore in un'area di memoria.
     
bulletQuesta istruzione copia il contenuto dell'accumulatore nella locazione di memoria puntata da ES:DI.
bulletPer 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.
bulletIn 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).
bulletNonostante 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.
bulletDa notare che la LODS esegue il compito opposto della STOS.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
          STOS   Destinazione (ES:[DI]) << Sorgente (Accumulatore)

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

STOS

[Depo01]

11 3 4 5 1 1                    

STOS

[Depo02]

15
         
bulletLa 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]
          
bulletRiassumendo, in dettaglio l'istruzione si comporta in questo modo:
bulletIl dato prelevato dall'accumulatore ha la dimensione di un byte, di una word o 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 o DSI), 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è STOSB, se i dati manipolati sono bytes, STOSW se sono word, o STOSD se doubleword.
bulletQuesta potente istruzione esegue con un solo codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice:
         
MOV   ES:[DI],AL
INC   DI
     
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, 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.
bulletViene 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
         
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 stringa da riempire, cioè con il numero dei suoi caratteri
bulletl'azione del LOOP riempie la stringa Testo01 di asterischi, '*'.
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 183 - STOS

    

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