Assemblaggio - Condizioni
L'esecuzione condizionale in linguaggio assembly viene eseguita da diverse istruzioni di loop e branching. Queste istruzioni possono modificare il flusso di controllo in un programma. L'esecuzione condizionale viene osservata in due scenari:
Sr.No. | Istruzioni condizionali |
---|---|
1 | Unconditional jump Questa operazione viene eseguita dall'istruzione JMP. L'esecuzione condizionale spesso implica il trasferimento del controllo all'indirizzo di un'istruzione che non segue l'istruzione in esecuzione. Il trasferimento del controllo può essere in avanti, per eseguire una nuova serie di istruzioni o all'indietro, per rieseguire gli stessi passaggi. |
2 | Conditional jump Questo viene eseguito da una serie di istruzioni di salto j <condizione> a seconda della condizione. Le istruzioni condizionali trasferiscono il controllo interrompendo il flusso sequenziale e lo fanno modificando il valore di offset in IP. |
Discutiamo l'istruzione CMP prima di discutere le istruzioni condizionali.
Istruzioni CMP
L'istruzione CMP confronta due operandi. Viene generalmente utilizzato nell'esecuzione condizionale. Questa istruzione sostanzialmente sottrae un operando dall'altro per confrontare se gli operandi sono uguali o meno. Non disturba la destinazione o gli operandi di origine. Viene utilizzato insieme all'istruzione di salto condizionale per il processo decisionale.
Sintassi
CMP destination, source
CMP confronta due campi di dati numerici. L'operando di destinazione potrebbe essere nel registro o in memoria. L'operando sorgente potrebbe essere un dato, un registro o una memoria costanti (immediati).
Esempio
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7: ...
CMP viene spesso utilizzato per confrontare se un valore del contatore ha raggiunto il numero di volte in cui è necessario eseguire un ciclo. Considera la seguente condizione tipica:
INC EDX
CMP EDX, 10 ; Compares whether the counter has reached 10
JLE LP1 ; If it is less than or equal to 10, then jump to LP1
Salto incondizionato
Come accennato in precedenza, ciò viene eseguito dall'istruzione JMP. L'esecuzione condizionale spesso implica il trasferimento del controllo all'indirizzo di un'istruzione che non segue l'istruzione in esecuzione. Il trasferimento del controllo può essere in avanti, per eseguire una nuova serie di istruzioni o all'indietro, per rieseguire gli stessi passaggi.
Sintassi
L'istruzione JMP fornisce un nome di etichetta in cui il flusso di controllo viene trasferito immediatamente. La sintassi dell'istruzione JMP è:
JMP label
Esempio
Il seguente frammento di codice illustra l'istruzione JMP:
MOV AX, 00 ; Initializing AX to 0
MOV BX, 00 ; Initializing BX to 0
MOV CX, 01 ; Initializing CX to 1
L20:
ADD AX, 01 ; Increment AX
ADD BX, AX ; Add AX to BX
SHL CX, 1 ; shift left CX, this in turn doubles the CX value
JMP L20 ; repeats the statements
Salto condizionale
Se una determinata condizione è soddisfatta nel salto condizionale, il flusso di controllo viene trasferito a un'istruzione di destinazione. Esistono numerose istruzioni di salto condizionale a seconda delle condizioni e dei dati.
Di seguito sono riportate le istruzioni di salto condizionale utilizzate sui dati con segno utilizzati per le operazioni aritmetiche:
Istruzioni | Descrizione | Bandiere testate |
---|---|---|
JE / JZ | Salta uguale o Salta zero | ZF |
JNE / JNZ | Salta non uguale o Salta diverso da zero | ZF |
JG / JNLE | Salta maggiore o Salta non inferiore / uguale | OF, SF, ZF |
JGE / JNL | Salta maggiore / uguale o Salta non inferiore | OF, SF |
JL / JNGE | Salta di meno o Salta non maggiore / uguale | OF, SF |
JLE / JNG | Salta inferiore / uguale o non maggiore | OF, SF, ZF |
Di seguito sono riportate le istruzioni di salto condizionale utilizzate sui dati senza segno utilizzati per le operazioni logiche:
Istruzioni | Descrizione | Bandiere testate |
---|---|---|
JE / JZ | Salta uguale o Salta zero | ZF |
JNE / JNZ | Salta non uguale o Salta diverso da zero | ZF |
JA / JNBE | Salta sopra o Salta non sotto / uguale | CF, ZF |
JAE / JNB | Salta sopra / uguale o Salta non sotto | CF |
JB / JNAE | Salta sotto o Salta non sopra / uguale | CF |
JBE / JNA | Salta sotto / uguale o Salta non sopra | AF, CF |
Le seguenti istruzioni di salto condizionale hanno usi speciali e controllano il valore dei flag -
Istruzioni | Descrizione | Bandiere testate |
---|---|---|
JXCZ | Salta se CX è zero | nessuna |
JC | Salta se trasporta | CF |
JNC | Salta se non lo porti | CF |
JO | Jump If Overflow | DI |
JNO | Salta se non c'è overflow | DI |
JP / JPE | Salta parità o Salta parità pari | PF |
JNP / JPO | Salta senza parità o Salta parità dispari | PF |
JS | Segno di salto (valore negativo) | SF |
JNS | Jump No Sign (valore positivo) | SF |
La sintassi per il set di istruzioni J <condizione> -
Esempio,
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ...
EQUAL: ...
Esempio
Il seguente programma visualizza la più grande delle tre variabili. Le variabili sono variabili a due cifre. Le tre variabili num1, num2 e num3 hanno rispettivamente i valori 47, 22 e 31 -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num2]
check_third_num:
cmp ecx, [num3]
jg _exit
mov ecx, [num3]
_exit:
mov [largest], ecx
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,largest
mov edx, 2
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1
int 80h
section .data
msg db "The largest digit is: ", 0xA,0xD
len equ $- msg
num1 dd '47'
num2 dd '22'
num3 dd '31'
segment .bss
largest resb 2
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
The largest digit is:
47