| LA PILE PROGRAMME |
QU'EST-CE QUE LA PILE ?
Imaginez une colonne recevant des CD. Cette colonne contient un certain nombre de logements. Chacun de ces logements peut recevoir un CD. Cette colonne possède un bas et un haut (Cool !). A chaque fois que vous ajoutez un CD, en général, vous commencez par le haut. Elle se remplit en s'étendant vers le bas. Lorsqu'il n'y a plus d'emplacement, la colonne est saturée et il faudra en augmenter la capacité pour qu'elle en reçoive d'autres.
Et bien, la pile d'un programme c'est exactement pareil.
Les paramètres (CD) de fonction sont placés sur la pile (colonne à CD) en commençant par le haut, le deuxième à l'emplacement en-dessous, etc... Lorsqu'il n'y a plus d'espace (logement) la pile est pleine et une défaillance programme est annoncée.
Il important de toujours bien vérifier que l'espace alloué à la pile est suffisant pour le bon fonctionnement du programme.LES REGISTRES
Trois registres sont utilisés à cet effet. Ce sont : SS, ESP, EBP.
SS est un registre de segment. Pour simplifier, il contient l'adresse de base du segment de données relatives aux paramètres et variables de fonction. C'est-à-dire le bas de la pile.
ESP est le registre qui pointe toujours sur le somment de la pile vide. Donc, il pointe sur le dernier emplacement rempli.
EBP est un registre qui est utilisé pour créer un cadre de pile pour la fonction concernée. Il facilite la gestion des paramètres, variables locales des fonctions.
LES INSTRUCTIONS
Les instructions qui agissent sur la pile : push, call, ret, retf, pop
push Décrémente la pile de 4 octets et place la donnée à cet emplacement.
call Décrémente la pile de 4 octets et place l'adresse de la prochaine instruction à exécuter au retour de la fonction.
ret ou retn (ces deux intructions sont équivalentes) Dépile et récupère l'adresse placée par l'instruction call.
retf Fait la même chose que l'instruction ret mais utilise en plus la valeur segment dans le cas d'un appel lointain.
pop Enlève la dernière valeur mise sur la pile.
enter Crée un cadre de pile.
leave Détruit le cadre de pile.

LE CADRE DE PILE :
Le cadre de pile est un espace de stockage situé dans le segment mémoire attribué au registre de pile : SS. Cet espace sert aux variables locales et aux paramètres des fonctions appelées.
Le cadre de pile est géré par le registre EBP. Son contenu est très important. Grâce à la valeur qu'il contient, on peut accéder aux variables locales et aux paramètres de la fonction courante. Il permet également de retrouver les cadres de pile des fonctions appelantes.
Le cadre de pile d'une fonction est créé en
sauvegardant sur la pile le contenu du registre EBP puis, on copie dans
ce dernier le contenu du registre ESP. EBP est égal, à ce
niveau, à ESP et sa valeur ne changera jamais.
Le registre EBP contient un pointeur sur l'emplacement, sur la pile,
lequel contient le pointeur du cadre de pile de la fonction appelante.
En mode 32 bits, pour accéder aux paramètres on utilisera
la notation suivante : [EBP + 8] et pour accéder aux variables
locales : [EBP - 4].
En mode 16 bits, pour accéder aux paramètres on utilisera
la notation suivante : [BP + 6] et pour accéder aux variables
locales : [BP - 2].
Etant donné que le contenu du registre EBP est une valeur
précieuse, il ne sera jamais modifié. On l'utilisera
toujours
de façon indexée. L'index est un décalage multiple
de 4 ou de 2 selon le mode du microprocesseur.
