| Le figure seguenti mostrano le risorse
richieste da questa istruzione in funzione degli operandi
coinvolti (leggi le istruzioni);
valutando il codice macchina generato dall'assemblatore possiamo notare
alcune importanti differenze:
| se viene esplicitamente scritta la
direttiva SHORT l'istruzione è
codificata con 2 bytes (il codice
operativo EB 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
0104+24=0128. |
Addr |
|
Codifica
Masm |
|
Sequenza
Bytes |
|
Istruzione |
|
0102
0104
....
0128 |
|
EB
24 |
|
EB
24
..............
..............
90 |
|
; ........
; ........
LabelNear: |
JMP SHORT LabelNear
... omissis .........
... omissis .........
NOP |
|
Naturalmente la regola vale anche se il
salto relativo è indietro, cioè se il dato prelevato è negativo:
nell'esempio illustrato qui sotto si ha 0107+FB=107-5=0102.
Addr |
|
Codifica
Masm |
|
Sequenza
Bytes |
|
Istruzione |
|
0102
0103
0104
0105
0107 |
|
90
90
90
EB FB
............. |
|
90
90
90
EB FB
.............. |
|
LabelNear:
;.........
|
NOP
NOP
NOP
JMP SHORT LabelNear |
|
| se viene indicata solo l'etichetta
(o se si specifica esplicitamente, insieme ad essa, NEAR
Ptr) l'istruzione è codificata con 3
bytes; naturalmente il salto è comunque intrasegmentale ed è curioso
osservare che l'assemblatore è in grado di capire se si tratta di un salto
corto (-128,+127) o vicino
(-32767,+32768).
Nel primo caso, dopo il codice operativo, il medesimo di prima, EB,
codifica un byte con segno) e il codice di NOP:
in pratica ha capito che, per localizzare l'indirizzo d'arrivo basta un
numero con segno a 8 bit, da sommare algebricamente
al puntatore IP
all'istruzione successiva; nei 2 esempi:
0105+2C=0130
e 108+29=0130;
poichè il terzo bytes previsto dal codice mnemonico non è necessario,
l'assemblatore lo codifica con 90, NOP. |
Addr |
|
Codifica
Masm |
|
Sequenza
Bytes |
|
Istruzione |
|
0102
0105
0108
....
0130 |
|
EB
2C 90
EB 29
90
.............
.............
90 |
|
EB
2C 90
EB 29
90
..............
..............
90 |
|
;.........
; ........
LabelNear:
|
JMP LabelNear
JMP NEAR Ptr LabelNear
... omissis
.........
... omissis
.........
NOP |
|
Nel secondo caso
Addr |
|
Codifica
Masm |
|
Sequenza
Bytes |
|
Istruzione |
|
0102
0105
....
02C0 |
|
E9
02C0
E9 02C0
.............
90 |
|
E9
BB 01
E9 B8 01
..............
90 |
|
; ........
LabelNear:
|
JMP LabelNear
JMP NEAR Ptr LabelNear
... omissis .........
NOP |
|
| se il salto è di tipo FAR l'istruzione
è codificata con 5 bytes: il codice operativo
è ora EA ed è seguito dai 4
byte che esprimono l'offset e il segment della locazione a cui
saltare, da mettere rispettivamente al posto di IP
e di CS: nell'esempio l'assemblatore
e il linker sono in grado di codificare correttamente l'indirizzo a cui
saltare con l'aiuto della potente direttiva
AT: |
Addr |
|
Codifica
Masm |
|
Sequenza
Bytes |
|
Istruzione |
|
0000
0024
0024
0024
----
0000
0100
0100 |
|
-------------
EA 0024 ---- |
|
---------------
EA 24 00 00 00 |
|
AltroSeg
LabelFar
AltroSeg
;--------
_prog
INIZIO:
;........
|
SEGMENT
AT
0000H
ORG 0009H*4
LABEL DWORD
ENDS
--------------------------
ASSUME ES:AltroSeg
SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_prog,DS:_prog
ORG 0100H
JMP FAR Ptr LabelFar
|
|
| osserviamo, infine, la codifica proposta
in caso di salto è indiretto; in questo caso l'indirizzo a cui saltare
è fornito con l'aiuto di registri o dal contenuto di locazioni di
memoria: |
|