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

 Utilisation des sauts conditionnels avec CMP

 

Les sauts conditionnels permettent de réaliser des actions répétitives ou conditionnelles, comme dans les boucles, les tests et les branchements logiques.

Une boucle se divise généralement en deux parties :

  1. La partie qui exécute une action

  2. La partie qui teste si l’action doit continuer

 

Exemple simple d’une boucle

 

 
MOV AX,0 ; initialisation du compteur
Boucle:
INC AX ; incrémente AX
CMP AX,12 ; compare AX à 12
JE Fin ; si AX = 12, saute à Fin
JMP Boucle ; sinon, répète la boucle
Fin:
  • Ici, CMP AX,12 met à jour les flags selon la valeur de AX.

  • JE Fin saute vers l’étiquette Fin si ZF = 1 (AX = 12).

  • Le JMP Boucle relance la boucle tant que AX ≠ 12.

 

Version optimisée

 

 
MOV AX,0
Boucle:
INC AX
CMP AX,12
JNE Boucle ; saute tant que AX ≠ 12
  • Avec cette version, une instruction JMP est supprimée, ce qui rend le code plus rapide et lisible.

  • Vous pouvez remplacer JNE par n’importe quel saut conditionnel selon le flag approprié (CF, SF, ZF…).

  • Plusieurs CMP ou boucles peuvent être imbriquées pour créer des programmes plus complexes.

 

Instructions mathématiques

 

L’assembleur offre des instructions pour toutes les opérations arithmétiques, signées ou non signées.

 

Multiplication – MUL et IMUL

 

  • MUL : multiplication non signée

  • IMUL : multiplication signée

Règles :

  • L’opérande source se trouve dans un registre (BX, CX…)

  • Le registre AX contient le nombre à multiplier

  • Résultat : AX ← AX * source

 

Exemple non signé :

 
MOV AX,2
MOV BX,5
MUL BX ; AX = 2*5 = 10 ; BX = 5

Exemple signé :

 
MOV AX,-10
MOV BX,3
IMUL BX ; AX = -30
  • Pour IMUL sur 16 bits, utilisez CWD pour étendre le signe dans DX si nécessaire :

 
CWD ; étend le signe de AX vers DX
IMUL BX ; multiplication signée avec résultat sur DX:AX si nécessaire
  • Pour les multiplications non signées, assurez-vous que DX = 0 avant MUL.

 

Division – DIV et IDIV

 

  • DIV : division non signée

  • IDIV : division signée

  • Divise le contenu de AX (ou DX:AX pour 32 bits) par la source.

  • Résultat : AX ← quotient, DX ← reste

Exemple :

 
MOV AX,12
MOV BX,5
IDIV BX ; AX = 2 (quotient), DX = 2 (reste)

Attention : la division par zéro provoque une erreur et retourne au DOS.

 

Décalages – SHR et SHL

 

  • SHR : shift right → divise par une puissance de 2

  • SHL : shift left → multiplie par une puissance de 2

 

Exemples :

 
SHR AX,1 ; AX / 2
SHR BX,2 ; BX / 4
SHL CX,3 ; CX * 8
SHL AX,4 ; AX * 16
  • On peut combiner plusieurs décalages pour multiplier par un nombre non puissance de 2 :

 
MOV AX,12 ; AX = X
MOV BX,AX ; BX = X
SHL AX,8 ; AX*256
SHL BX,6 ; BX*64
ADD AX,BX ; AX = X*320
  • Cette méthode est rapide mais parfois plus complexe que MUL.

 

Changement de signe – NEG

 

  • NEG inverse le signe d’un registre ou d’une variable mémoire :

 
MOV AX,12
NEG AX ; AX = -12

MOV CL,-3
NEG CL ; CL = 3

 

Nombres à virgule fixe

 

  • L’assembleur ne gère pas directement les nombres à virgule dans les registres (sans coprocesseur).

  • On utilise des nombres entiers représentatifs avec un facteur fixe (ex. 256) :

Exemple : multiplier 300 par 0.5

 
MOV AX,128 ; 0.5 * 256
MOV CX,300
XOR DX,DX ; DX = 0
MUL CX ; AX = 300*128
SHR AX,8 ; AX / 256 → AX = 150
  • Plus le facteur de conversion est grand, plus le calcul est précis.

  • Attention aux dépassements et aux nombres signés.

 

Résumé pratique

 

  • Boucles → CMP + saut conditionnel (JNE, JE, JA, etc.)

  • Multiplications → MUL / IMUL

  • Divisions → DIV / IDIV

  • Décalages rapides → SHL / SHR

  • Changement de signe → NEG

  • Nombres à virgule fixe → multiplier puis décaler avec SHR/SHL

 

Ces instructions forment la base pour toutes les opérations arithmétiques et le contrôle du flux en assembleur.