Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 169 di 198] 

    

    SCASD - Confronta le doublewords di un'area di memoria con EAX, modificando le flags
     
bulletQuesta istruzione non appartiene al Set dell'8088/86; si usa solo con 80386/486.
bulletIl suo compito è quello di confrontare il contenuto dell'accumulatore con quello di una locazione di memoria puntata da ES:DI e modifica le flag in funzione del risultato.
bulletIn pratica simula la sottrazione della doubleword destinazione da EAX senza però alterarne il contenuto (come farebbe invece l'effettiva sottrazione, SUB); questo basta per modificare le flag coinvolte dal risultato e a favorire gli eventuali salti condizionati (Jxx) conseguenti.
bulletL'istruzione è particolarmente utile per trovare una determinata doubleword in una tabella; per confrontare 2 tabelle è disponibile la CMPSD, che si basa sul medesimo principio di funzionamento.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
   SCASD  Cambia le Flag  simulando {EAX - doubleword in ES:[DI]}
 

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

SCASD

 

15 7 7 6 2 1 #       # # # # #
         
bulletLa tabella evidenzia che l'istruzione modifica alcune flag e l'assenza di operandi: in realtà, essendo un'applicazione particolare della SCAS, pur non dichiarandoli esplicitamente l'istruzione coinvolge i dati a 32 bit presenti nella locazione messa a confronto con l'accumulatore;  in dettaglio:
bulletIl dato prelevato dalla locazione di memoria ha la dimensione di una doubleword.
bulletil segmento dell'area Dati è per default, ES e l'offset è per default DI; non è possibile forzare un altro registro di segmento, con l'override.
bulletdopo aver confrontato il dato con l' 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):
bulletse DF=0 (direzione in avanti) al puntatore viene sommato 4..
bulletse DF=1 (direzione indietro) al puntatore viene sottratto 4.
bullet la presenza di operandi non è necessaria: la lettera D posta dopo lo mnemonico SCAS fa capire all'assemblatore che i dati da trattare sono a 32 bit.
bulletin 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.
bulletQuesta potente istruzione esegue con un solo codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice:
         
CMP   EAX,ES:[DI]
ADD   DI,4
     
bulletLa figura seguente mostra le caratteristiche di questa istruzione:
          

Addr

Codifica Masm

Istruzione

0100 0032 [.. 00..] Depo01 DD  50 DUP (00H)
---- ---------------- ------- ----------------------
01C8 AF SCASD 
         
bulletPrima di concludere è opportuno sottolineare che questa istruzione può fruire dell'operatore di autoripetizione REPE o REPNE: anteponendolo al suo mnemonico il processo di confronto viene ripetuto automaticamente CX volte su tutta l'area sotto test, a meno che non venga trovato un valore uguale (E) o diverso (NE) dall'accumulatore; per il corretto uso dei questo prefisso è dunque necessario caricare preventivamente CX con il numero di confronti da eseguire.
bulletData l'utilità di questa tecnica viene proposto un esercizio d'esempio:
         

Addr

 

Codifica Masm  

 

Istruzione

0100   12345678
56789ABC
9ABCDEF0
  Tab_32                  DD 12345678H
                        DD 56789ABCH
                        DD 9ABCDEF0H
----   ----------------   ------------------ ---------------------------
010C
010D
0111
0117
011A
011D
----

0121
0122
----
0124


0127
  FC
8D 3E 0100
66 B8 10000000
B9 0003
F2 66 AF
0F 84 0124
----------------

90
EB 03
----------------
83 EF 04


90
 





;-----------------
tutti_diversi:


;-----------------
trovato:


continua:
      CLD
      LEA   DI,Tab_32
      MOV   EAX,10000000H
      MOV   CX,3
REPNE SCASD
      JE  trovato
---------------------------
; servizio non trovato     
      NOP                  
      JMP  SHORT continua  
;--------------------------

      SUB  DI,4            
; servizio trovato         
;--------------------------

      NOP
         
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 di default è ES e non può essere cambiato con l'override ES.
bulletil contatore CX è stato caricato con la dimensione della tabella e il prefisso REPNE provvederà a ripetere automaticamente il confronto se il dato assunto dalla locazione è diverso da 10000000H, valore predisposto il EAX, fino all'esaurimento di tutti gli elementi.
bulletse le doubleword sono tutte diverse da 10000000H il processo ha termine regolarmente e, essendo NE la condizione d'uscita, l'istruzione JE non verrà eseguita e il programma proseguirà subito sotto, nella zona di programma indicata dall'etichetta tutti_diversi.
bulletse viene rilevato almeno un dato uguale a 10000000H il processo verrà immediatamente interrotto prima della fine e, essendo ora E la condizione d'uscita, l'istruzione JE verrà eseguita e il programma proseguirà più in basso, nella zona di programma indicata dall'etichetta trovato: la prima istruzione da eseguire è, in questo caso, il decremento di 4 del puntatore DI, così da favorire la localizzazione della word a 10000000H nella tabella sotto test.

    

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 169 - SCASD

    

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