| Questa istruzione confronta
il contenuto dell'accumulatore con quello di una locazione di memoria
puntata da ES:DI
e
modifica le flag in funzione del risultato. |
| In pratica simula
la sottrazione dell'operando destinazione dall'accumulatore
senza però alterare
il contenuto dell'accumulatore (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. |
| Per funzionare correttamente è necessario
specificare un operando destinazione, di solito l'etichetta
del primo dei dati da confrontare con l'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). |
| L'istruzione è particolarmente utile per trovare
un determinato byte o carattere in una stringa
o in una tabella; per confrontare
2 stringhe o tabelle è disponibile la CMPS,
che si basa sul medesimo principio di funzionamento. |
| Nonostante la necessità di dichiarare
l'operando sorgente (solo per motivi di corretta compilazione) i dati sono
comunque assunti
dalla 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 SCAS
ES:Testo01 con LEA
DI,Testo01, vedi esempio successivo). |
| Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
| 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, ES e l'offset è per
default DI;
per questo è assolutamente necessario inizializzare i registri (insieme alla flag DF)
prima di utilizzarle; non è possibile
forzare un altro registro di segmento, con l'override. |
| dopo aver confrontato il dato con l'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):
| 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è SCASB,
se i dati manipolati sono bytes, SCASW
se sono word, o SCASD se doubleword.
|
|
| Questa potente istruzione esegue con un solo
codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice: |