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