|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
170
di 198] |
 |
|
SCASW - Confronta
le words di un'area di memoria con AX, modificando le flags |
|
 | 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 della word destinazione
da AX 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. |
 | L'istruzione è particolarmente utile per trovare
una determinata word in una tabella; per confrontare
2 tabelle è disponibile la CMPSW,
che si basa sul medesimo principio di funzionamento. |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
SCASW |
Cambia
le Flag simulando {AX
- word in ES:[DI]} |
| |
|
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 |
SCASW
|
|
15 |
7 |
7 |
6 |
2 |
1 |
# |
|
|
|
# |
# |
# |
# |
# |
 | La 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 16
bit presenti nella locazione messa a confronto con l'accumulatore; in
dettaglio:
 | Il dato prelevato dalla locazione di
memoria ha la dimensione di una word.
|
 | il segmento
dell'area Dati è
per default, ES e l'offset è per
default DI; 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),
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 2.. |
 | se DF=1
(direzione indietro) al puntatore viene sottratto 2. |
|
 | la presenza di
operandi non è necessaria: la lettera W
posta dopo lo mnemonico SCAS fa
capire all'assemblatore che i dati da trattare sono a 16
bit. |
 | in 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. |
|
 | Questa potente istruzione esegue con un solo
codice operativo il compito di 2 istruzioni, cioè equivale all'esecuzione del seguente codice: |
 | La figura seguente mostra le caratteristiche
di questa istruzione: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
| 0100 |
|
0032
[.. 00..] |
|
Depo01
DW 50 DUP (00H) |
| ---- |
|
---------------- |
|
------- |
---------------------- |
| 0164 |
|
AF |
|
|
SCASW |
|
 | Prima 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. |
 | Data l'utilità di questa tecnica viene proposto un
esercizio d'esempio: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
|
0100 |
|
1234
5678
9ABC |
|
Tabel16 DW 1234H
DW 5678H
DW 9ABCH
|
| ---- |
|
---------------- |
|
------------------ |
--------------------------- |
010C
010D
0111
0117
011A
011C
---
0120
0121 |
|
FC
8D 3E 0100
B8 1000
B9 0003
F2 AF
0F 84 011A
----------------
90
EB 03
----------------
83 EF 02
90 |
|
;-----------------
tutti_diversi:
;-----------------
trovato:
continua: |
CLD
LEA DI,Tab_16
MOV AX,1000H
MOV CX,3
REPNE SCASW
JE trovato
---------------------------
;
servizio non trovato
NOP
JMP SHORT continua
;--------------------------
SUB DI,2
;servizio trovato
;--------------------------
NOP |
|
 | L'analisi del codice suggerisce queste considerazioni:
 | la presenza dell'istruzione CLD
impone la lettura della memoria in avanti. |
 | per inizializzare l'offset DI
del puntatore si è fatto uso l'uso dell'istruzione LEA. |
 | il segment di default è ES e
non può essere cambiato con l'override
ES. |
 | il 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 1000H, valore predisposto il AX, fino all'esaurimento di tutti gli
elementi. |
 | se le word sono tutte diverse
da 1000H
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. |
 | se viene rilevato almeno un
dato uguale a 1000H 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 2 del
puntatore DI,
così da favorire la localizzazione della word a 1000H nella tabella sotto test. |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|