Esecuzione condizionale in linguaggio assembly è compiuta da diverse istruzioni loop e ramificazione. Queste istruzioni possono cambiare il flusso di controllo di un programma. Esecuzione condizionale si osserva in due scenari -

SN Istruzioni condizionali
1
Salto incondizionato

Questa operazione viene eseguita tramite l'istruzione JMP. Esecuzione condizionale spesso comporta un trasferimento di controllo per l'indirizzo di un'istruzione che non segue l'istruzione attualmente in esecuzione. Trasferimento di controllo può essere in avanti, per eseguire un nuovo set di istruzioni o all'indietro, eseguire nuovamente la stessa procedura.

2
Salto condizionato

Questa operazione viene eseguita da una serie di istruzioni di salto j <condizione> a seconda della condizione. Le istruzioni condizionali trasferire il controllo rompendo il flusso sequenziale e lo fanno modificando il valore di offset di IP.

Cerchiamo di discutere l'istruzione CMP prima di discutere le istruzioni condizionali.

CMP Istruzione
L'istruzione CMP confronta due operandi. Viene generalmente usato in esecuzione condizionale. Questa istruzione sottrae fondamentalmente un operando dall'altro per il confronto se i operandi sono uguali oppure no. Non disturba gli operandi di destinazione o di origine. Viene usato insieme con l'istruzione di salto condizionale per il processo decisionale.

Sintassi
CMP destination, source
CMP confronta due campi di dati numerici. L'operando destinazione potrebbe essere o nel registro o nella memoria. L'operando fonte potrebbe essere una costante di dati (immediato), registrarsi o la memoria.

Esempio
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7:
CMP è spesso usato per comparare se un valore del contatore ha raggiunto il numero di volte che un ciclo deve essere eseguito. Si consideri il 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, questa viene eseguita dal JMP. Esecuzione condizionale spesso comporta un trasferimento di controllo per l'indirizzo di un'istruzione che non segue l'istruzione attualmente in esecuzione. Trasferimento di controllo può essere in avanti, per eseguire un nuovo set di istruzioni o all'indietro, eseguire nuovamente la stessa procedura.

Sintassi
L'istruzione JMP fornisce un nome di etichetta dove 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 qualche condizione specificata è soddisfatta in salto condizionato, il flusso di controllo viene trasferito ad una istruzione di destinazione. Ci sono numerose istruzioni di salto condizionato a seconda della condizione e dati.

Di seguito sono le istruzioni di salto condizionato utilizzati su dati firmati utilizzati per operazioni aritmetiche -

Istruzione Descrizione Bandiere testato
JE / JZ Salta Salta Uguale o Zero ZF
JNE / JNZ Salta non uguale o salto non Zero ZF
JG / JNLE Salta Maggiore o saltare non di meno / Equal DI, SF, ZF
JGE / JNL Salta Maggiore o salto non meno OF, SF
JL / JNGE Salta Minore o salto non Maggiore / Uguale OF, SF
JLE / JNG Salta Meno / Uguale o saltare non maggiore DI, SF, ZF
Di seguito sono riportate le istruzioni di salto condizionato utilizzati su dati non firmati utilizzati per le operazioni logiche -

Istruzione Descrizione Bandiere testato
JE / JZ Salta Salta Uguale o Zero ZF
JNE / JNZ Salta non uguale o salto non Zero ZF
JA / JNBE Salta sopra o saltare non inferiore / Equal CF, ZF
JAE / JNB Salta Sopra / Uguale o salto non Sotto CF
JB / JNAE Vai sotto o salto non Sopra / Equal CF
JBE / JNA Salta Sotto / Uguale o Non Salta Sopra AF, CF
Le seguenti istruzioni di salto condizionato hanno usi speciali e verificare il valore di bandiere -

Istruzione Descrizione Bandiere testato
JXCZ Salta se CX è Zero nessuno
JC Salta Se Carry CF
JNC Salta Se No Carry CF
JO Salta Se Overflow DI
JNO Salta Se No Overflow DI
JP / JPE Salta Salta o Parità Parità Pari PF
JNP / JPO Salta nessuna parità o saltare parità dispari PF
JS Salta Sign (valore negativo) SF
JNS Salta Nessun Segno (valore positivo) SF
La sintassi per il J <condizioni> set di istruzioni -

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 valori di 47, 72 e 31, rispettivamente, -

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, [num3]

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 di cui sopra è compilato ed eseguito, esso produce il seguente risultato -

The largest digit is:
47