Assembleur : fonctionnement de la pile
Historique
29 juillet 2010 : Création de cette page sur l'ancien site de Païou
Difficulté
Pour : un esprit logique et curieux.
Introduction
La pile est une zone de mémoire permettant de stocker temporairement et de retrouver rapidement des valeurs pour :
- Placer des variables locales dans un sous-programme,
- Sauvegarder l'adresse de retour (fait par les instructions CALL, INT),
- Transmettre les arguments à un sous-programme.
Son fonctionnement
Une pile en assembleur fonctionne à la manière d'une pile d'assiettes, mais à l'envers :
- On ajoute une assiette en dessous de la pile.
- On retire l'assiette qui est en bas de la pile.
Par ailleurs :
- La taille d'un élément mémorisé dans la pile est de 1 mot (2 octets).
- Deux registres, SS (segment) et SP (offset) pointent vers l'adresse du premier octet du dernier élément empilé.
En conséquence :
- Le début de la pile garde donc toujours la même adresse (la base).
- Chaque fois que l'on ajoute un élément dans la pile, l'adresse de son premier octet diminue de 2 unités.
Le registre SP doit donc être décrémenté de deux unités.
Les instructions s'y rapportant
- Définir la pile
Il faut d'abord définir la zone mémoire où est logée la pile.
La pile étant encore vide, les deux registres, SS (segment) et SP (offset) devront donc pointer vers l'adresse du sommet de la pile.
Il suffit de définir la valeur des registres, par exemple de la façon suivante :
XOR AX,AXMet AX à 0
MOV SS,AX car MOV SS,0 n'existe pas.
MOV SP,7BFC
- Empiler
L'empilement d'un élément (mot) se fait par l'instruction :
PUSH registre
Et cela se traduit par :
- le registre SP est décrémenté de 2 unités et SS:SP pointent ainsi vers l'adresse où sera stocké le contenu du registre
- le registre y est copié
exemple :PUSH CS
- Dépiler
Le dépilement d'un élément (mot) se fait par l'instruction :
POP registre
Et cela se traduit par :
- l'élément de la pile est copié dans le registre
- le registre SP est incrémenté de 2 unités et SS:SP pointent ainsi vers l'adresse où est stocké le contenu de l'élément précédent de la pile.
- Sous-programme
L'instruction CALL adressepermet d'appeler un sous-programme ou routine.
Avant d'exécuter cette routine, le registre IP (pointe l'instruction qui est placée juste après CALL) est empilée, exactement comme si une instruction PUSH avait été utilisée.
- Retour de sous-programme
La fin de la routine est indiquée par une instruction RET. Lors de l'exécution de celle-ci, le dernier élément de la pile (normalement l'adresse contenue dans IP, juste après la lecture de l'instruction CALL) est dépilé. Le programme peut ainsi continuer après la routine.
Afficher
Dans tout programme, il faut pouvoir afficher : pour saisir des données, pour afficher des résultats ...
La gestion de l'affichage, en assembleur, 