Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 066 di 198] 

    

    JMP - Salta incondizionatamente
     
bulletQuesta istruzione esegue un salto non condizionato ad una specifica locazione; in pratica modifica i puntatori di codice CS:IP, obbligando il processore ad eseguire istruzioni in tutt'altra parte del programma.
bulletA differenza della CALL non potrà tornare automaticamente nel punto del programma da cui è partito, dato che non si provvede ad alcun salvataggio nello stack.
bulletIl salto può essere SHORT (nel range 127 in avanti e 128 indietro), NEAR (nel range 32767 in avanti e 32768 indietro) o FAR (in un altro segmento).
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
         JMP Destinazione  IP  <<  Destinazione

Esempio di Applicazione

Cicli di Clock Mem
Acces

Bytes
Flag   influenzate
Mnemonico Operandi 86 268 386 486 O D I T S Z A P C

JMP

 Short Label

15 7+m 7+m 3 no 2                      
JMP  Near Ptr Label 15 7+m 7+m 3 no 3

JMP

 Far Ptr Label

15 11+m 12+m 17 no 5

JMP

 AX

11 7+m 7+m 5 no 2

JMP

 [Depo02]

18+EA 11+m 10+m 5 no 2,4
         
bulletLa tabella evidenzia che l'istruzione non altera alcuna flag. Inoltre mostra le possibili tipologie dell'unico operando:
bulletetichetta (salto diretto), lasciando all'assemblatore il compito di sostituirla con i 16 o i 32 bit dell'effettivo indirizzo, vicino o lontano.
bulletun registro a 16 o 32 bit (salto indiretto).
bulletil valore contenuto in una locazione di memoria (a 16 o a 32 bit), puntata nei possibili modi (ancora salto indiretto).
bulletNell'istruzione di salto, tra JMP e l'etichetta, può essere esplicitamente aggiunta la direttiva SHORT : questo accorgimento consente di risparmiare un byte di codice, ma è possibile solo se il salto viene eseguito nello spazio tra le 127 locazioni in avanti e le 128 indietro; un buon programmatore impara a non ricorrere a salti più lunghi... ma se ciò capitasse (o fosse necessario) l'assemblatore segnalerà errore ("error A2053: Jump out of range by nnn byte(s)") e a noi basterà eliminare la parola SHORT per far tornare le cose a posto.
         
bulletLe 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:
bulletse 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
         
bulletse 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
         
bulletse 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
         
bulletosserviamo, 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: 
         

Addr

Codifica Masm

Sequenza Bytes

Istruzione

0100 55AA AA 55 Depo02 DW 55AAH
---- ---------------- ----------------- ---------- ----------------------
0102
0104
0108
010D
0111
0116
FF E0
FF 26 0100
2E FF 26
0100
FF 26
0100
26 FF 26
0100
36 FF 26
0100
FF E0
FF 26 00 01
2E FF 26
00 01
FF 26
00 01
26 FF 26
00 01
36 FF 26
00 01
JMP AX
JMP [
Depo02]
JMP CS:[
Depo02]
JMP DS:[
Depo02]
JMP ES:[
Depo02]
JMP SS:[
Depo02]

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 066 - JMP

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati