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