[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 556.   Le istruzioni di salto

Con il linguaggio macchina, le strutture di controllo si realizzano solo attraverso le istruzioni di salto. Una di queste istruzioni è incondizionata, mentre le altre sono sottoposte al verificarsi di una condizione. A loro volta, le istruzioni di salto condizionato si dividono in due gruppi: uno riferito al controllo dello stato di un certo indicatore, l'altro riferito virtualmente a un confronto di valori.

556.1   Portata del salto

In generale, le istruzioni di salto hanno un solo operando, costituito dal riferimento all'indirizzo di memoria da raggiungere. Il compilatore traduce il riferimento all'indirizzo di memoria in un «dislocamento», ovvero nella quantità di byte da percorrere, in avanti o indietro. A questo proposito, ciò che rappresenta il riferimento alla memoria può avere dimensioni diverse e questo significa che l'istruzione può richiedere di precisare la dimensione del numero che rappresenta tale dislocamento. In modo predefinito, la dimensione del numero usato per indicare il dislocamento è quella di un registro comune.

Si osservi che la possibilità di dichiarare esplicitamente l'entità del dislocamento dipende dal compilatore; d'altro canto, sarebbe compito del compilatore determinarlo automaticamente.

556.2   Salto incondizionato

Il salto incondizionato si ottiene con l'istruzione JMP:

JMP imm

Con un linguaggio assemblatore, il valore immediato richiesto come operando si ottiene indicando il nome di un'etichetta già dichiarata altrove nel sorgente:

# Salto incondizionato
#
.section .text
.globl _start
#
_start:
    mov $1, %ebx
bp1:
    jmp bp3
bp2:
    mov $2, %ebx        # Questa istruzione non viene eseguita.
bp3:
    mov $1,   %eax      # Conclude il funzionamento con la
    int $0x80           # chiamata di sistema 1 (exit).
; Salto incondizionato
;
section .text
global _start
;
_start:
    mov ebx, 1
bp1:
    jmp bp3
bp2:
    mov ebx, 2          ; Questa istruzione non viene eseguita.
bp3:
    mov eax, 1          ; Conclude il funzionamento con la
    int 0x80            ; chiamata di sistema 1 (exit).

In questo esempio si vede che l'istruzione contenuta tra i punti bp2 e bp3 non viene mai eseguita.

556.3   Salto condizionato dallo stato di un indicatore

Un gruppo di istruzioni di salto condizionato dipende dallo stato di un certo indicatore. Queste istruzioni hanno la forma seguente, dove la lettera x identifica l'indicatore da controllare:

Jx imm
JNx imm

Per esempio, l'istruzione JZ salta se l'indicatore zero è attivo, mentre JNZ salta se l'indicatore zero non è attivo.

Tabella 556.3. Salti condizionati dallo stato di un indicatore particolare.

Nome Operandi:
dstorg1org2
Descrizione
JC
JNC
imm Salta se l'indicatore del riporto (carry), rispettivamente, è attivo, oppure non è attivo.
JO
JNO
imm Salta se l'indicatore di traboccamento (overflow), rispettivamente, è attivo, oppure non è attivo.
JS
JNS
imm Salta se l'indicatore di segno (sign), rispettivamente, è attivo, oppure non è attivo.
JZ
JNZ
imm Salta se l'indicatore di zero, rispettivamente, è attivo, oppure non è attivo.
JP
JNP
imm Salta se l'indicatore di parità, rispettivamente, è attivo, oppure non è attivo.

556.4   Salto condizionato da un confronto

Il gruppo più importante di istruzioni di salto condizionato dipende da un confronto, che di solito si realizza con l'istruzione CMP. In pratica, l'istruzione CMP simula una sottrazione, aggiornando gli indicatori come se si trattasse di una sottrazione vera e propria; successivamente, l'istruzione di salto condizionato verifica gli indicatori e si comporta di conseguenza.

Da quanto descritto si deve comprendere che, anche se le istruzioni di questo tipo richiamano l'idea del confronto tra due valori, in pratica dipendono da indicatori che possono essere stati modificati da istruzioni di tipo differente.

Dal momento che, ai fini del confronto tra due valori, la valutazione degli indicatori va fatta diversamente a seconda che si tratti di interi senza segno o con segno, queste istruzioni sono suddivise in sottogruppi.

Tabella 556.4. Salti condizionati dall'esito di un confronto con valori interi senza segno.

Nome Operandi:
dstorg1org2
Descrizione
JA
JNBE
imm Dopo un confronto di valori senza segno, salta se la destinazione era maggiore dell'origine.
CMP dst, org
IF dst > org
THEN go to imm
JAE
JNB
imm Dopo un confronto di valori senza segno, salta se la destinazione era maggiore o uguale all'origine.
CMP dst, org
IF dst >= org
THEN go to imm
JB
JNAE
imm Dopo un confronto di valori senza segno, salta se la destinazione era minore dell'origine.
CMP dst, org
IF dst < org
THEN go to imm
JBE
JNA
imm Dopo un confronto di valori senza segno, salta se la destinazione era minore o uguale all'origine.
CMP dst, org
IF dst <= org
THEN go to imm

Tabella 556.5. Salti condizionati dall'esito di un confronto con valori interi, indipendentemente dal segno.

Nome Operandi:
dstorg1org2
Descrizione
JE
imm Dopo un confronto, indipendentemente dal segno, salta se la destinazione era uguale all'origine.
CMP dst, org
IF dst == org
THEN go to imm
JNE
imm Dopo un confronto, indipendentemente dal segno, salta se la destinazione era diversa dall'origine.
CMP dst, org
IF dst =/= org
THEN go to imm

Tabella 556.6. Salti condizionati dall'esito di un confronto con valori interi con segno.

Nome Operandi:
dstorg1org2
Descrizione
JG
JNLE
imm Dopo un confronto con segno, salta se la destinazione era maggiore dell'origine.
CMP dst, org
IF dst > org
THEN go to imm
JGE
JNL
imm Dopo un confronto con segno, salta se la destinazione era maggiore o uguale all'origine.
CMP dst, org
IF dst >= org
THEN go to imm
JL
JNGE
imm Dopo un confronto con segno, salta se la destinazione era minore dell'origine.
CMP dst, org
IF dst < org
THEN go to imm
JLE
JNG
imm Dopo un confronto con segno, salta se la destinazione era minore o uguale all'origine.
CMP dst, org
IF dst <= org
THEN go to imm

556.5   Cicli

È possibile realizzare dei cicli enumerativi attraverso delle istruzioni simili a quelle di salto condizionato, dove in pratica, dopo il blocco di istruzioni da reiterare, viene verificata la condizione e quindi, eventualmente, si ripete il ciclo. Si distinguono tre casi:

LOOP imm
LOOPE imm | LOOPZ imm
LOOPNE imm | LOOPNZ imm

In tutte le situazioni, il valore immediato che viene fornito come operando si riferisce al dislocamento dell'indirizzo di memoria da raggiungere (cosa che viene tradotta dal compilatore, sostituendo l'etichetta con il numero appropriato). Il dislocamento consentito è breve (±128 byte), quindi non si possono realizzare cicli contenenti tante istruzioni.

In tutte le situazioni, l'istruzione decrementa prima il registro ECX (oppure solo CX, se viene dichiarato l'uso di una dimensione «breve», ovvero a soli 16 bit(1)) senza alterare gli indicatori, quindi verifica se tale registro è diverso da zero. Nel caso dell'istruzione LOOP, il fatto che il registro, dopo il decremento di una unità, contenga ancora un valore diverso da zero, è sufficiente per far scattare la ripetizione del ciclo; nel caso di LOOPE o di LOOPZ, è necessario anche che l'indicatore zero sia attivo; per converso, con LOOPNE o LOOPNZ, è necessario anche che l'indicatore zero non sia attivo.


1) Dipende dal compilatore se è possibile limitare effettivamente l'uso al solo registro CX.


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome le_istruzioni_di_salto.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory