|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
029
di 198] |
 |
|
CMPSW - Confronta
le Words di 2 aree di memoria modificando le flags |
|
 | Questa istruzione analizza
le words contenute in 2 locazioni di memoria e
modifica le flag in funzione del risultato. |
 | In pratica simula
la sottrazione
dei 16 bit della
locazione sorgente
da quelli della locazione destinazione
senza però alterare
la word della destinazione (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. |
 | Si tratta di una istruzione piuttosto
efficiente, nata per confrontare il contenuto di 2 aree di
memoria; per default utilizza le coppie di registri
DS:SI per puntare in minuendo
(destinazione) e ES:DI per
puntare il sottraendo (sorgente). |
 | In questo è evidente una incongruenza con le
convenzioni Intel, per cui il registro indice Sorgente
per eccellenza è SI (Source
Index) e quello Destinazione è DI
(Destination Index): prendiamo
atto senza farci intimorire.... |
 | L'istruzione è particolarmente utile per confrontare
2 tabelle; per trovare una
determinata word in una tabella
è disponibile la SCASW che si basa sul
medesimo principio di funzionamento. |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
CMPSW |
Cambia
le Flag simulando { DS:[SI]
- 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 |
|
CMPSW
|
|
22 |
8 |
10 |
8 |
2 |
1 |
# |
|
|
|
# |
# |
# |
# |
# |
 | La tabella evidenzia l'assenza di operandi: in
realtà, essendo un'applicazione particolare della CMPS,
pur non dichiarandoli esplicitamente l'istruzione coinvolge i dati a 16
bit presenti nelle locazioni messe a confronto; in dettaglio:
 | Il dato prelevato dalle 2 locazioni di
memoria ha la dimensione di una word. |
 | il segmento
dell'area Sorgente (usata per puntare il sottraendo) è
sempre ES. e quello dell'area Destinazione (usata per puntare il minuendo) è
sempre DS. |
 | dopo aver modificato le flag in funzione
del confronto aggiorna il valore dei registri
di offset (SI,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) ad entrambi i puntatori viene sommato 2. |
 | se DF=1
(direzione indietro) ad entrambi i puntatori viene sottratto 2. |
|
 | la presenza di
operandi non è necessaria: la lettera W
posta dopo lo mnemonico CMPS fa
capire all'assemblatore che i dati da trattare sono a 16
bit. |
 | in tutti i casi non va dimenticato che
queste istruzioni
usano per default i puntatori
DS:SI e ES:DI,
per cui è assolutamente necessario inizializzarli (insieme alla flag DF)
prima di utilizzarle. |
|
 | Questa potente istruzione esegue con un solo
codice operativo il compito di ben 4 istruzioni (anche se a rigor di
logica dovremmo mettere in conto anche il salvataggio e il recupero delle
flag, dato che ADD influisce su di
loro), cioè equivale all'esecuzione del seguente codice: |
MOV
AX,DS:[SI]
CMP AX,ES:[DI]
PUSHF
ADD SI,2
ADD DI,2
POPF |
 | La figura seguente mostra le caratteristiche
di questa istruzione: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0164 |
|
0032
[.. 00..]
0032 [.. 00..] |
|
Depo01
DW 50 DUP (00H)
Depo02 DW
50 DUP (00H) |
| ---- |
|
---------------- |
|
------- |
---------------------- |
| 01C8 |
|
A7 |
|
|
CMPSW |
|
 | 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 trovata una coppia di valori uguali (E) o diversi (NE); 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
0164
-----
01C8
01C9
01CC
01D0
01D4
01D6
01DA
01DB
01DD
01E0
01E3 |
|
0032 [ ?? ]
0032 [ ?? ]
-----------
FC
B9 0032
8D 36 0100
8D 3E
0164
F3 A7
0F 85 1DD
90
EB 06
83 EE 02
83 EF 02
90 |
|
Depo01
Depo02
----------------
;---------------
tutte_uguali:
;---------------
trovata_diversa:
continua: |
DW
50 DUP (?)
DW
50 DUP (?)
-------------------------------
CLD
MOV CX,50
LEA SI,Depo01
LEA DI,Depo02
REPE CMPSW
JNE
trovata_diversa
;---------------------------
;
servizio coppie uguali
NOP
JMP SHORT continua
;------------------------------
SUB SI,2
SUB DI,2
; servizio prima coppia diversa
;------------------------------
NOP |
|
|
|
|
|
 | L'analisi del codice suggerisce queste considerazioni:
 | prendiamo nota della tecnica con cui viene riservata memoria per le 2
aree da confrontare, con la pseudoistruzione
Dup. |
 | notiamo la presenza dell'istruzione CLD,
per imporre un'analisi in avanti. |
 | per inizializzare gli offset
dei 2 puntatori si è fatto uso l'uso dell'istruzione LEA. |
 | i segment si ritengono quelli di default, DS e
ES. |
 | il contatore CX è stato caricato con la dimensione di
entrambe le aree e il prefisso REPE
provvederà a ripetere automaticamente il confronto se le 2 word
assunte dalla coppia di locazioni sono uguali tra loro, fino
all'esaurimento di tutti gli elementi. |
 | se le coppie di word sono
tutte uguali il processo ha termine regolarmente e, essendo E
la condizione d'uscita, l'istruzione JNE
non verrà eseguita e il programma
proseguirà subito sotto, nella zona di programma indicata
dall'etichetta tutte_uguali. |
 | se viene rilevata una coppia
diversa il processo verrà
immediatamente interrotto prima della fine e, essendo ora NE
la condizione d'uscita, l'istruzione JNE
verrà eseguita e il programma
proseguirà più in basso, nella zona di programma indicata
dall'etichetta trovata_diversa.: le
prime istruzioni da eseguire sono, in questo caso, il ripristino dei
puntatori DI e SI,
sottraendo ad entrambi 2, così da favorire la localizzazione dei dati
trovati diversi. |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|