|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
106
di 198] |
 |
|
LOOPE - Salta CX
volte se uguale |
|
 | Questa istruzione esegue
un numero CX di
salti ad una specifica locazione, purché i numeri senza segno
coinvolti in una operazione
aritmetico-logica siano uguali; il
salto viene dunque eseguito se
il registro CX è diverso
da 0 e se la flag di Zero è lasciata a
1 prima dell'eventuale salto. |
 | In pratica prima
decrementa il valore di CX e
poi:
 | se CX=0000
o se una precedente operazione
aritmetico-logica ha prodotto risultato non nullo (anche se CX non è ancora
a 0000) prosegue con l'istruzione successiva. |
 | se CX
è diverso da 0000 e se una
precedente operazione
aritmetico-logica ha lasciato [flag di Zero]=1,
salta all'indirizzo suggerito dall'etichetta che lo
rappresenta, di solito presente nelle prossimità dell'istruzione stessa
(che l'ha dichiarata) seguita da
":" (2 punti). |
 | in entrambi i casi modifica il puntatore di codice CS:IP. |
|
 | Naturalmente perchè sia significativa bisogna predisporre in CX
un numero compreso tra 0 e 65535; con 80386/486
il registro di riferimento diventa ECX, per
cui il range diventa a 32 bit. |
 |
Fai
attenzione: i salti
sono sempre di tipo corto (Short), cioè
rispetto alla posizione in cui vengono richiesti, possono puntare le
istruzioni poste 127 locazioni in avanti
o 128 indietro. Un errore
frequente, nelle prime esperienze di programmazione è proprio
quello di inserire troppe
istruzioni tra il punto di partenza e il punto di arrivo del
salto: in queste occasioni l'assemblatore segnala l'errore "error A2053: Jump out of range by
nnn byte(s)" |
 | In realtà i processori dal 80386.consentono
salti di tipo near (vicino),
cioè nel range 32767 in avanti e 32768
indietro; se viene specificata la pseudoOperazione
.386, l'assemblatore non
segnala errore e codifica l'istruzione nel modo più corto
possibile (anche short se è possibile). |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
|
LOOPE Destinazione |
Salta se
CX non contiene zero e ffZ=1 |
| |
|
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 |
LOOPE |
etichetta
|
18 |
8 |
11 |
9 |
no |
2 |
|
|
|
|
|
|
|
|
|
| 6 |
4 |
5 |
6 |
no |
 | La tabella mette in evidenza che in presenza
di salto (prima riga) è necessario un numero maggiore di cicli di Clock,
anche perchè il processore è costretto a reinizializzare
la coda dell'istruzione al fine di assumere i codici
operativi dell'istruzione a cui cedere il controllo (evidentemente non
consecutiva a quella che richiede il salto..); se il salto non
viene eseguito i tempi d'esecuzione (seconda riga) sono più rapidi. |
 |
Fai
attenzione: il numero caricato in CX
è quello dei giri (loop, cicli) che si ammette di fare, se
non si trovano dati diversi; non
dimenticare che l'istruzione prima decrementa CX e poi,
eventualmente, salta: per questa ragione se, per
errore (o coscientemente..) carichi
CX con 0000 il programma sembra
bloccarsi. Per forza! l'hai
obbligato a fare 65535 giri! |
 | Il servizio di questa istruzione è identico a
quello offerto dalla LOOPZ (salta
se è zero). |
 | L'istruzione specifica (dopo LOOP) la condizione
che impone il salto, in questo caso E,
legata all'evento Equal, "salta
se è uguale..."; subito dopo indica l'etichetta della
locazione a cui saltare, di solito dopo le istruzioni di CMP
o di SUB. |
 | Di solito il salto si esegue indietro: l'istruzione è
codificata con 2 bytes (il codice
operativo E1 seguito da un byte
con segno); quando viene eseguita preleva il dato e lo somma algebricamente
al valore del puntatore IP
all'istruzione successiva; nell'esempio 0107
+ FC =
107 - 4
= 0103
(leggi le
istruzioni):
|
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0103
0105
0107 |
|
B9 0064
3A C3
E1 FC
90 |
|
;---------
Ciclo:
;---------
|
MOV CX,100
-------------------------------
; servizio CX non zero e ffZ=1
CMP AL,BL
LOOPE Ciclo
-------------------------------
; servizio
CX=0000 e ffZ=0
NOP |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|