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 :
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 :
-
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 :
-
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
-
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
-
BX : taille du programme en paragraphes de 16 bytes
-
Ajouter 1 pour éviter les erreurs
Réserver un bloc mémoire
-
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
-
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)