Zero One Cyber

Contenu du cours
Tutoriel Assembleur – Chapitre 1 : Les bases indispensables pour débuter
Dans ce premier chapitre, tu découvriras les fondamentaux du langage Assembleur afin de comprendre comment un programme interagit directement avec le processeur et la mémoire. Tu apprendras : ce qu’est réellement l’Assembleur et à quoi il sert le rôle du processeur, des registres et de la mémoire la structure d’un programme assembleur les instructions de base et leur fonctionnement le flux d’exécution d’un programme les notions essentielles pour lire et comprendre du code assembleur simple Ce chapitre pose les bases indispensables pour aborder la programmation bas niveau, le reverse engineering et l’analyse de binaires dans la suite du cours. Aucun prérequis avancé n’est nécessaire : tout est expliqué pas à pas, avec une approche claire et accessible.
0/13
Programmation bas niveau : maîtriser l’Assembleur

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 :

 
CMP op1, op2
  • Le processeur calcule op1 - op2 sans 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 :

 
MOV AL, 200
ADD AL, 100 ; AL dépasse 255 → CF = 1
 

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 :

 
MOV AL, 5 ; 5 = 00000101b → 2 bits à 1 → PF = 1
ADD AL, 1 ; 6 = 00000110b → 2 bits à 1 → PF = 1

 

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 :

 
MOV AL, 0x09
ADD AL, 0x01 ; AL = 0x0A → AF = 1

 

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 :

 
MOV AX, 10
SUB AX, 10 ; AX = 0 → ZF = 1

 

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 :

 
MOV AL, -5 ; AL = FBh → SF = 1

 

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 :

 
MOV AL, 127
ADD AL, 1 ; dépassement du maximum 127 → OF = 1

 

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 N après le J inverse 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

 
CMP AX, BX
JE EQUAL ; saute si AX = BX (ZF = 1)
JB LESS ; saute si AX < BX (CF = 1)
JG GREATER ; saute si AX > BX (ZF = 0 et SF = OF)

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.