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

Introduction à la mémoire

 

La mémoire est un composant fondamental de l’ordinateur. Elle stocke temporairement ou durablement des données et instructions utilisées par le processeur.

Dans ce chapitre, nous travaillons en mode réel (mode DOS, accès à la mémoire conventionnelle ≤ 640 Ko). Le code en mode protégé nécessite une approche différente que nous n’aborderons pas ici.

 

Nous allons voir comment :

 

  • Manipuler des données à différents segments

  • Déplacer des blocs mémoire efficacement

  • Réserver et libérer de la mémoire pour nos programmes

 

Chargement d’adresses dans les registres

 

Déplacement d’offset et de segment

 

Pour accéder à une variable ou un tableau dans un segment, il faut charger l’offset et éventuellement le segment :

 

 
MOV SI, OFFSET MESSAGE ; place l’offset de MESSAGE dans SI
MOV AX, SEG MESSAGE ; place le segment de MESSAGE dans AX
MOV DS, AX ; charge le segment dans DS

Les registres de segments (DS, ES, FS, GS) ne peuvent pas recevoir une valeur immédiate, uniquement un registre.

 

Utilisation de LEA

 

L’instruction LEA (Load Effective Address) permet de charger l’offset d’une variable dans un registre de manière plus concise :

 

 
LEA SI, MESSAGE ; équivalent à MOV SI, OFFSET MESSAGE
  • Avantage : code plus lisible et compact

  • Recommandation : privilégiez LEA pour tous les offsets

 

Déplacement de blocs mémoire

 

Assembler offre des instructions pour copier rapidement des blocs de mémoire sans lire octet par octet.

 

Instruction Taille déplacée Description
MOVSB 1 byte Déplace un byte de DS:SI vers ES:DI
MOVSW 2 bytes Déplace un word (16 bits)
MOVSD 4 bytes Déplace un dword (32 bits, 386+)
  • DS:SI : source
  • ES:DI : destination

 

Pour répéter plusieurs fois le déplacement, utilisez REP avec CX comme compteur :

 
; Copier 10000 bytes
MOV CX,10000
REP MOVSB

; Copier 5000 words (1 word = 2 bytes)
MOV CX,5000
REP MOVSW

; Copier 2500 dwords (1 dword = 4 bytes)
MOV ECX,2500
REP MOVSD

  • Après chaque MOVSx, DI est automatiquement incrémenté de 1, 2 ou 4 selon la taille.

 

Stockage d’une valeur dans un bloc mémoire

 

Les instructions STOSx permettent de remplir un bloc mémoire avec une valeur fixe (AL, AX ou EAX) :

Instruction Taille stockée
STOSB 1 byte
STOSW 2 bytes
STOSD 4 bytes

 

Exemple : effacer un bloc mémoire de 1000 bytes

 
MOV CX,1000 ; nombre de répétitions
MOV AL,0 ; valeur à stocker
REP STOSB ; remplit ES:DI avec AL
  • Pour STOSB, seule AL est utilisée (AH est ignoré).

  • Chaque STOSx incrémente DI automatiquement.

 

Réservation de mémoire sous DOS

 

Pour réserver de la mémoire conventionnelle, on utilise les interruptions DOS :

 

Libérer de la mémoire utilisée par le programme

 
MOV BX, taille ; taille du programme en paragraphes (taille/16 +1)
MOV AH, 4Ah
INT 21h
  • BX : taille du programme en paragraphes de 16 bytes

  • Ajouter 1 pour éviter les erreurs

 

Réserver un bloc mémoire

 
MOV AH, 48h
MOV BX, mem_voulue ; taille désirée en paragraphes
INT 21h
JC NOT_ENOUGH_MEM ; saute si échec (carry flag = 1)
  • AX contiendra le segment du bloc réservé

  • Conservez cette valeur pour désallouer la mémoire plus tard

 

Désallocation d’un bloc mémoire

 
MOV BX, taille_bloc
MOV AX, segment_bloc ; segment réservé précédemment
MOV ES, AX
MOV AH, 49h
INT 21h
  • Important : toujours libérer la mémoire pour éviter les fuites et conflits avec d’autres programmes

 

Notes importantes

 

  • La mémoire conventionnelle DOS ≤ 640 Ko

  • Pour plus de mémoire, il faut passer en mode protégé ou flat, ce qui nécessite une approche différente

  • Les instructions MOVSx et STOSx sont beaucoup plus rapides que des boucles classiques

  • Toujours vérifier la disponibilité de la mémoire avec JC (carry flag)