Istruzioni di salto
L'ordine con cui le istruzioni di un programma vengono eseguite viene chiamato "flusso".
Ogni programma deve poter modificare il flusso delle sue istruzioni in base agli input che riceve ed ai risultati in corso di elaborazione. Nel linguaggio macchina sono presenti istruzioni che permettono di cambiare l'ordine con cui il programma viene eseguito.
Queste istruzioni dette di salto vengono chiamate in Inglese jump oppure branch. Nelle CPU x86 i salti possono essere incondizionati, condizionati, ripetitivi.
Un salto rompe la continuità del flusso delle istruzioni e fa in modo che la prossima istruzione eseguita non sia quella che segue nella memoria, ma un'altra. Il flusso del programma salta quindi ad un'istruzione diversa da quella "naturale".
Come si usano
Tutte le istruzioni di salto hanno una sintassi comune, ed il risultato della loro esecuzione consiste nel saltare, se la condizione è vera, ad un punto del programma specificato da una "etichetta".
JMP etichetta .... .... etichetta: MOV AX,CX
Salti incondizionati
Un salto è incondizionato quando viene eseguito sempre e comunque.
I processori x86 chiamano questa istruzione JMP, ma effettivamente bisognerebbe parlare di istruzioni JMP.
Proprio così, le istruzioni JMP e non l'istruzione JMP, perchè dietro l'espressione mnemonica JMP, usata dall'assembler, si celano in effetti ben tre tipi di JMP che chiameremo: short, long, far.
I primi due tipi (short e long) agiscono in intorni di memoria limitati, e per questo sono detti anche NEAR. Il tipo short agisce in un intorno di +/- 128 byte, ossia è in grado di raggiungere locazioni di memoria che distano non più di 128 byte dall'istruzione stessa. Il tipo long agisce all'interno di un segmento (64 Kb), ossia è in grado di raggiungere qualsiasi locazione di memoria purchè all'interno dello stesso segmento di appartenenza.
I due tipi NEAR sono anche chiamati relativi perchè calcolano la distanza della locazione da raggiungere con riferimento a se stessi; pertanto sono anche autorilocabili.
L'ultimo tipo (far) è in grado di raggiungere qualunque locazione di memoria all'interno del MegaByte indirizzabile da un 8086. E' anche chiamato assoluto perchè utilizza, all'interno del suo codice, l'indirizzo completo della locazione da raggiungere; pertanto non è una istruzione autorilocabile.
La tabella seguente riassume ed esemplifica alcune delle caratteristiche principali delle istruzioni JMP.
MNEMO | TIPO | OPCODE | BYTE | ESEMPI | CODIFICA | COMMENTI |
JMP | short | EB .. | 2 | 3000 JMP 3020 | EB 1E | Salto Relativo in avanti |
3000 JMP 2FE0 | EB DE | Salto Relativo all'indietro | ||||
JMP | long | E9 .. .. | 3 | 3000 JMP 4000 | E9 FD 0F | Salto Relativo in avanti |
3000 JMP 2000 | E9 FD EF | Salto Relativo all'indietro | ||||
JMP | far | EA .. .. .. .. | 5 | 3000 JMP F030:105B | EA 5B 10 30 F0 | Salto Assoluto |
Salti condizionati
Oltre a saltare, un programma deve anche essere in grado di fare confronti fra numeri e di eseguire parti di codice diverse in base ai risultati dei confronti.
Perché un programma "prenda decisioni" si devono introdurre delle jump che saltano a punti diversi in base al risultato delle operazioni precedenti, ossia le jump "condizionate.
Le jump condizionate saltano all'indirizzo indicato nell'istruzione solo se è vera una certa condizione, altrimenti il programma prosegue come se l'istruzione di salto non esistesse.
Salti ripetitivi
Sono casi particolari dei salti condizionati. Vengono ripetuti ciclicamente finchè una determinata condizione non si avvera.
La tabella seguente raggruppa le principali istruzioni di salto, salto condizionato e salto ripetuto. Le fasce di colore caratterizzano gruppi di istruzioni accomunate da una qualche caratteristica, che, in generale, riguarda la tipologia della condizione di salto.
JMP | Salta in ogni caso. (Per il codice, vedi tabella precedente.) | ** |
JO | Salta se il flag O è attivo. Overflow. | 70 |
JNO | Salta se il flag O è nullo. Niente Overflow. | 71 |
JC JB - JNAE | Salta se il flag C è attivo. Dopo una CMP se il primo operando è inferiore al secondo operando. | 72 |
JNC JAE - JNB | Salta se il flag C è nullo. Dopo una CMP se il primo operando è superiore o uguale al secondo operando. | 73 |
JZ - JE | Salta se il flag Z è attivo. Dopo una CMP quando il primo operando è uguale al secondo operando. | 74 |
JNZ - JNE | Salta se il flag Z è nullo. Dopo una CMP quando il primo operando è diverso dal secondo operando. | 75 |
JS | Salta se il flag S è attivo. Numero con bit di Segno (Signed). | 78 |
JNS | Salta se il flag S è nullo. Numero senza bit di Segno (Not Signed). | 79 |
JP - JPE | Salta se il flag P è attivo. Parità Pari (Even). | 7A |
JNP - JPO | Salta se il flag P è nullo. Parità Dispari (Odd). | 7B |
JBE - JNA | Salta se almeno uno dei flag C e Z è attivo. Dopo una CMP quando il primo operando è inferiore o uguale al secondo operando. | 76 |
JA - JNBE | Salta se i flag C e Z sono entrambi nulli. Dopo una CMP quando il primo operando è superiore al secondo operando. | 77 |
JL - JNGE | Salta se i flag S e O sono diversi tra loro. Dopo una CMP quando il primo operando è minore del secondo operando. | 7C |
JGE - JNL | Salta se i flag S e O sono uguali tra loro. Dopo una CMP quando il primo operando è maggiore o uguale al secondo operando. | 7D |
JLE - JNG | Salta se i flag S e O sono diversi tra loro e il flag Z è attivo. Dopo una CMP quando il primo operando è minore o uguale al secondo operando. | 7E |
JG - JNLE | Salta se i flag S e O sono uguali tra loro e il flag Z è nullo. Dopo una CMP quando il primo operando è maggiore del secondo operando. | 7F |
JCXZ | Salta se il registro CX=0. | E3 |
LOOP | Salta ripetutamente, decrementando CX, finchè CX=0. Prima di eseguire l'istruzione, CX deve contenere un opportuno valore iniziale. | E2 |
LOOPZ LOOPE | Salta ripetutamente finchè non divenga attivo il flag Z. | E1 |
LOOPNZ LOOPNE | Salta ripetutamente finchè non divenga nullo il flag Z. | E0 |
La vita comincia dove il pensiero finisce.
Jiddu Krishnamurti (1895-1986)