Assemblage - Conditions

L'exécution conditionnelle en langage assembleur est réalisée par plusieurs instructions de bouclage et de branchement. Ces instructions peuvent modifier le flux de contrôle dans un programme. L'exécution conditionnelle est observée dans deux scénarios -

Sr.No. Instructions conditionnelles
1

Unconditional jump

Ceci est effectué par l'instruction JMP. L'exécution conditionnelle implique souvent un transfert de contrôle à l'adresse d'une instruction qui ne suit pas l'instruction en cours d'exécution. Le transfert de contrôle peut être vers l'avant, pour exécuter un nouvel ensemble d'instructions ou vers l'arrière, pour réexécuter les mêmes étapes.

2

Conditional jump

Ceci est effectué par un ensemble d'instructions de saut j <condition> en fonction de la condition. Les instructions conditionnelles transfèrent le contrôle en interrompant le flux séquentiel et elles le font en modifiant la valeur de décalage dans IP.

Discutons de l'instruction CMP avant de discuter des instructions conditionnelles.

Instruction CMP

L'instruction CMP compare deux opérandes. Il est généralement utilisé dans l'exécution conditionnelle. Cette instruction soustrait essentiellement un opérande de l'autre pour comparer si les opérandes sont égaux ou non. Il ne perturbe pas les opérandes de destination ou de source. Il est utilisé avec l'instruction de saut conditionnel pour la prise de décision.

Syntaxe

CMP destination, source

CMP compare deux champs de données numériques. L'opérande de destination peut être soit dans le registre, soit en mémoire. L'opérande source peut être une donnée constante (immédiate), un registre ou une mémoire.

Exemple

CMP DX,	00  ; Compare the DX value with zero
JE  L7      ; If yes, then jump to label L7
.
.
L7: ...

CMP est souvent utilisé pour comparer si une valeur de compteur a atteint le nombre de fois qu'une boucle doit être exécutée. Considérez la condition typique suivante -

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

Saut inconditionnel

Comme mentionné précédemment, ceci est effectué par l'instruction JMP. L'exécution conditionnelle implique souvent un transfert de contrôle à l'adresse d'une instruction qui ne suit pas l'instruction en cours d'exécution. Le transfert de contrôle peut être vers l'avant, pour exécuter un nouvel ensemble d'instructions ou vers l'arrière, pour réexécuter les mêmes étapes.

Syntaxe

L'instruction JMP fournit un nom d'étiquette où le flux de contrôle est transféré immédiatement. La syntaxe de l'instruction JMP est -

JMP	label

Exemple

L'extrait de code suivant illustre l'instruction 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

Saut conditionnel

Si une condition spécifiée est satisfaite dans le saut conditionnel, le flux de contrôle est transféré vers une instruction cible. Il existe de nombreuses instructions de saut conditionnel en fonction de la condition et des données.

Voici les instructions de saut conditionnel utilisées sur les données signées utilisées pour les opérations arithmétiques -

Instruction La description Drapeaux testés
JE / JZ Jump Equal ou Jump Zero ZF
JNE / JNZ Sauter pas égal ou sauter pas zéro ZF
JG / JNLE Sauter plus grand ou sauter pas moins / égal DE, SF, ZF
JGE / JNL Sauter plus grand / égal ou sauter pas moins DE, SF
JL / JNGE Sauter moins ou sauter pas plus grand / égal DE, SF
JLE / JNG Sauter moins / égal ou sauter pas plus grand DE, SF, ZF

Voici les instructions de saut conditionnel utilisées sur les données non signées utilisées pour les opérations logiques -

Instruction La description Drapeaux testés
JE / JZ Jump Equal ou Jump Zero ZF
JNE / JNZ Sauter pas égal ou sauter pas zéro ZF
JA / JNBE Sauter au-dessus ou sauter pas en dessous / égal CF, ZF
JAE / JNB Sauter au-dessus / égal ou sauter pas en dessous CF
JB / JNAE Sauter en dessous ou sauter pas au-dessus / égal CF
JBE / JNA Sauter en dessous / égaler ou sauter pas au-dessus AF, CF

Les instructions de saut conditionnel suivantes ont des utilisations spéciales et vérifient la valeur des indicateurs -

Instruction La description Drapeaux testés
JXCZ Sauter si CX est zéro aucun
JC Sauter si porter CF
JNC Sauter si non CF
JO Sauter en cas de débordement DE
JNO Sauter si aucun débordement DE
JP / JPE Parité de saut ou parité de saut même PF
JNP / JPO Jump No Parity ou Jump Parity Odd PF
JS Signe de saut (valeur négative) SF
JNS Jump No Sign (valeur positive) SF

La syntaxe de l'ensemble d'instructions J <condition> -

Exemple,

CMP	AL, BL
JE	EQUAL
CMP	AL, BH
JE	EQUAL
CMP	AL, CL
JE	EQUAL
NON_EQUAL: ...
EQUAL: ...

Exemple

Le programme suivant affiche la plus grande des trois variables. Les variables sont des variables à deux chiffres. Les trois variables num1, num2 et num3 ont respectivement les valeurs 47, 22 et 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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

The largest digit is: 
47