|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
156
di 198] |
 |
|
REPNZ - Ripete automaticamente
il confronto di stringhe se gli elementi non sono nulli |
|
 | Questa istruzione è propriamente un prefisso
e va messa davanti
alle istruzioni che confrontano stringhe
o, in genere, aree di dati. |
 | Il suo compito è quello di obbligare
la ripetizione di questi tipi d'istruzione il numero
di volte indicato dal registro CX, a meno che il confronto
delle aree confrontate abbia rilevato elementi
uguali a zero. |
 | In altri termini la REPNZ
(Repeat if Non Zero, ripeti se non
zero) viene eseguita se,
dopo l'istruzione ripetuta, la [flag di Zero]=0
(vedi esempio alla fine della pagina). |
 | Il prefisso controlla se il valore della flag
di Zero è 1 o se quello di CX
è 0000H: in questi casi il processore non ripete l'istruzione e prosegue con il resto
del programma; altrimenti decrementa CX, esegue l'istruzione di confronto
stringhe e rientra nel loop. |
 | Dunque, se il valore iniziale della flag di
Zero è 1 o quello di CX è nullo il prefisso non produce alcun effetto, cioè nessuna delle
istruzioni supportate viene eseguita. |
 | Va sottolineato che, dopo aver verificato il
valore di CX, viene anche verificato se c'è qualche richiesta
d'interruzione pendente; non c'è dunque il pericolo che la ripetizione
delle istruzioni di gestione stringhe mettano in crisi questa importante
esigenza. |
 | Il prefisso si applica alle istruzioni:
 | CMPS
(e alle sue varianti CMPSB, CMPSW
e CMPSD). |
 | SCAS
(e alle sue varianti SCASB, SCASW
e SCASD). |
|
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
| REPNZ
<Istruzione> |
mentre
CX <> 0000H: esegue istruzione e decrementa CX |
| |
|
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 |
|
REPNZ
|
CMPS
|
9+22n |
5+9n |
5+9n |
7+7n |
no |
1 |
|
|
|
|
|
# |
|
|
|
| REPNZ |
CMPSB |
| REPNZ |
CMPSW |
| REPNZ |
CMPSD |
| REPNZ |
SCAS |
9+15n |
5+8n |
5+8n |
7+5n |
| REPNZ |
SCASB |
| REPNZ |
SCASW |
| REPNZ |
SCASD |
 | Il servizio di questa istruzione è identico a
quello offerto dalla REPNE (ripeti
se è non uguale). |
 | La figura seguente mostra le risorse
richieste da questa istruzione in funzione degli coinvolti
(leggi le
istruzioni): |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0103
0105
0107
010A
010C
010E
0110 |
|
F2 26 A6
F2 A6
F2 A7
F2 66 A7
F2 AE
F2 AE
F2 AF
F2 66 AF |
|
|
REPNZ CMPS ES:[DI],Byte Ptr [SI]
REPNZ CMPSB
REPNZ CMPSW
REPNZ CMPSD
REPNZ SCAS Byte Ptr ES:[DI]
REPNZ SCASB
REPNZ SCASW
REPNZ SCASD |
|
 | Data l'utilità di questo prefisso viene proposto un
esercizio d'esempio: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0132
-----
0164
0165
0168
016C
0170
0172
0176
0177
0179
017A
017B |
|
0032
[ ?? ]
0032 [ ?? ]
-------------
FC
B9 0032
8D 36 0100
8D 3E
0132
F2 A6
0F 85 0179
90
EB 02
4E
4F
90 |
|
Depo01
Depo02
----------------
;---------------
tutte_non_nulle:
;---------------
trovata_nulla:
continua: |
DB
50 DUP (?)
DB
50 DUP (?)
-------------------------------
CLD
MOV CX,50
LEA SI,Depo01
LEA DI,Depo02
REPNZ CMPSB
JZ
trovata_nulla
;---------------------------
;
servizio coppie diverse
NOP
JMP SHORT continua
;------------------------------
DEC
SI
DEC
DI
; servizio prima coppia uguale
;------------------------------
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 puntatori delle 2 aree da confrontare 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 REPNZ
provvederà a ripetere automaticamente il confronto se i 2 bytes
assunti dalla coppia di locazioni sono uguali tra loro, fino
all'esaurimento di tutti gli elementi. |
 | se le coppie di bytes sono
tutte diverse il processo ha termine regolarmente e, essendo NZ
la condizione d'uscita, l'istruzione JZ
non verrà eseguita e il programma
proseguirà subito sotto, nella zona di programma indicata
dall'etichetta tutte_non_nulle. |
 | se viene rilevata una coppia
uguale il processo verrà
immediatamente interrotto prima della fine e, essendo ora Z
la condizione d'uscita, l'istruzione JZ
verrà eseguita e il programma
proseguirà più in basso, nella zona di programma indicata
dall'etichetta trovata_nulla: le
prime istruzioni da eseguire sono, in questo caso, il decremento dei
puntatori DI e SI,
così da favorire la localizzazione dei dati trovati diversi. |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|