Les flags, les sauts conditionnels et l’instruction CMP
Dans la programmation en assembleur, certains concepts sont essentiels pour le contrôle du flux et les opérations arithmétiques : les flags, les sauts conditionnels et l’instruction CMP.
Les flags – Les indicateurs
Les flags (ou indicateurs) sont des bits qui reflètent l’état du processeur après l’exécution d’une instruction.
Ils sont regroupés dans le registre de flags et servent à prendre des décisions dans le programme (sauts conditionnels, gestion des retenues, etc.).
Lorsqu’une instruction est exécutée, certains flags sont modifiés automatiquement en fonction du résultat.
Les principaux flags (12 premiers bits)
| Bit | Nom | Utilité principale |
|---|---|---|
| 1 | CF | Carry Flag (retenue) |
| 3 | PF | Parity Flag (parité) |
| 5 | AF | Auxiliary Carry Flag |
| 7 | ZF | Zero Flag (résultat nul) |
| 8 | SF | Sign Flag (signe) |
| 9 | TF | Trap Flag (débogage) |
| 10 | IF | Interrupt Flag (interruption) |
| 11 | DF | Direction Flag (direction chaînes) |
| 12 | OF | Overflow Flag (dépassement) |
Les autres bits existent mais sont moins utilisés dans la majorité des programmes assembleur.
CF – Carry Flag (retenue)
Le Carry Flag indique une retenue lors d’une opération arithmétique :
-
Si le résultat d’une opération dépasse la capacité du registre (plus de bits disponibles), le bit supplémentaire est placé dans CF.
-
Certaines instructions modifient directement CF :
-
CLC: met CF à 0 -
STC: met CF à 1 -
CMC: inverse la valeur actuelle de CF
-
Ce flag est essentiel pour les opérations multi-octets ou les additions/soustractions avec retenue.
CMP – Comparaison
L’instruction CMP permet de comparer deux valeurs sans modifier les opérandes.
Elle fonctionne en effectuant une soustraction virtuelle :
-
Le processeur calcule
op1 - op2sans stocker le résultat. -
Les flags sont modifiés en conséquence : ZF, SF, CF, OF, etc.
-
Ces flags servent ensuite pour les sauts conditionnels.
Les sauts conditionnels
Les sauts conditionnels utilisent les flags pour déterminer si le programme doit continuer ou sauter à une autre instruction.
Exemples courants :
| Instruction | Condition | Description |
|---|---|---|
JE / JZ |
ZF = 1 | Saut si égal / zéro |
JNE / JNZ |
ZF = 0 | Saut si différent / non zéro |
JC |
CF = 1 | Saut si retenue |
JNC |
CF = 0 | Saut si pas de retenue |
JG / JNLE |
ZF = 0 et SF = OF | Saut si supérieur (entier signé) |
JL / JNGE |
SF ≠ OF | Saut si inférieur (entier signé) |
Les sauts conditionnels permettent de créer des boucles, des branches logiques et des contrôles de flux complexes.
Les flags, CMP et les sauts conditionnels en Assembleur
Dans la programmation en assembleur, les flags sont essentiels pour le contrôle du flux, la gestion des résultats d’opérations arithmétiques et logiques, et pour décider si des instructions conditionnelles doivent être exécutées.
Ils sont regroupés dans le registre de flags du processeur, et chaque flag est un bit qui indique un état particulier du processeur. Certaines instructions modifient ces flags automatiquement, tandis que d’autres peuvent les manipuler directement.
1. Les flags – Indicateurs du processeur
Les flags permettent de savoir ce qui se passe après une opération, par exemple :
-
Si une addition ou une soustraction a généré une retenue ou un emprunt
-
Si le résultat est nul
-
Si le résultat est négatif
-
Si un dépassement de capacité s’est produit
-
Si une opération a un nombre pair de bits à 1 (parité)
Voici les principaux flags et leur rôle détaillé :
CF – Carry Flag (retenue)
-
Bit 1 du registre de flags
-
Indique qu’une retenue (carry) s’est produite lors d’une addition ou qu’un emprunt a eu lieu lors d’une soustraction.
-
Utile pour les opérations multi-octets ou les nombres supérieurs à la capacité du registre.
-
Instructions associées :
-
CLC: Clear Carry → CF = 0 -
STC: Set Carry → CF = 1 -
CMC: Complement Carry → CF = ¬CF (inverse la valeur)
-
-
Exemple :
PF – Parity Flag
-
Indique si le nombre de bits à 1 dans le résultat est pair ou impair.
-
PF = 1→ nombre pair -
PF = 0→ nombre impair
-
-
Utilisé parfois pour vérifier l’intégrité des données ou pour certaines opérations logiques.
-
Exemple :
AF – Auxiliary Carry Flag
-
Retenue intermédiaire entre le bit 3 et le bit 4 d’un octet lors des additions/soustractions.
-
Principalement utilisée pour la conversion BCD (Binary Coded Decimal).
-
Exemple :
ZF – Zero Flag
-
Indique si le résultat d’une opération est nul.
-
ZF = 1→ résultat = 0 -
ZF = 0→ résultat ≠ 0 -
Très utilisé pour les boucles et les comparaisons.
-
Utile pour éviter des erreurs comme division par zéro.
-
Exemple :
SF – Sign Flag
-
Indique si le résultat est négatif dans une opération sur un nombre signé.
-
SF = 1→ résultat négatif -
SF = 0→ résultat positif -
Le bit le plus significatif du résultat est copié dans SF.
-
Exemple :
IF – Interrupt Flag
-
Contrôle la gestion des interruptions matérielles :
-
IF = 1→ interruptions autorisées -
IF = 0→ interruptions désactivées
-
-
Instructions associées :
-
STI→ active les interruptions -
CLI→ désactive les interruptions
-
DF – Direction Flag
-
Indique le sens de traitement des instructions de chaînes (MOVS, CMPS, LODS, STOS) :
-
DF = 0→ incrémentation des pointeurs (avance) -
DF = 1→ décrémentation des pointeurs (recule)
-
-
Instructions associées :
-
CLD→ DF = 0 -
STD→ DF = 1
-
OF – Overflow Flag
-
Indique un dépassement lors d’une opération arithmétique signée :
-
OF = 1→ dépassement (overflow) -
OF = 0→ pas de dépassement
-
-
Très utile pour éviter des erreurs dans les calculs signés.
-
Instruction associée :
INTO→ déclenche une interruption si OF = 1. -
Exemple :
2. Les instructions conditionnelles
Les instructions conditionnelles permettent de changer le flux du programme selon l’état des flags. Elles s’utilisent souvent après un CMP.
-
JMP : saut inconditionnel
-
Sauts conditionnels : saut selon un flag ou un ensemble de flags
Tableau des sauts conditionnels
| Instruction | Condition | Flag |
|---|---|---|
| JB / JNAE / JC | Inférieur (non signé) | CF = 1 |
| JAE / JNB / JNC | Supérieur ou égal (non signé) | CF = 0 |
| JE / JZ | Égal | ZF = 1 |
| JNE / JNZ | Différent | ZF = 0 |
| JO / JNO | Overflow / pas d’overflow | OF = 1 / OF = 0 |
| JP / JPE | Parité paire | PF = 1 |
| JNP / JPO | Parité impaire | PF = 0 |
| JS / JNS | Signe négatif / positif | SF = 1 / SF = 0 |
| JA / JNBE | Supérieur (non signé) | CF = 0 et ZF = 0 |
| JBE / JNA | Inférieur ou égal (non signé) | CF = 1 ou ZF = 1 |
| JG / JNLE | Supérieur (signé) | ZF = 0 et SF = OF |
| JGE / JNL | Supérieur ou égal (signé) | SF = OF |
| JL / JNGE | Inférieur (signé) | SF ≠ OF |
| JLE / JNG | Inférieur ou égal (signé) | ZF = 1 ou SF ≠ OF |
Ajouter un
Naprès leJinverse la condition.
3. L’instruction CMP
L’instruction CMP sert à comparer deux valeurs :
-
Elle fait une soustraction virtuelle (
op1 - op2) sans modifier les opérandes. -
Les flags sont mis à jour selon le résultat : ZF, CF, SF, OF, PF.
-
Les sauts conditionnels utilisent ensuite ces flags pour déterminer si le saut doit être effectué.
Exemples
En pratique, on compare souvent deux registres ou un registre et une valeur immédiate avant un saut conditionnel pour créer des boucles, tests logiques ou contrôles de flux.