MISE A JOUR Chapitre Chapitre 3 Pile
MISE A JOUR Chapitre Chapitre 3 Pile
MISE A JOUR Chapitre Chapitre 3 Pile
EMPILE : PUSH
PILE
a5
a4
a3
4 1
a2
3 2
2< a1 3
1 a0 4
ESP
ADRESSES
La gestion de la pile
VIDAGE (LIFO:Last In First Out)
DEPILE : POP
PILE
a5
a4
a3
4 1
a2
3 2
2< a1 3
1 a0 4
ESP
ADRESSES
RAPPEL
• La pile est une région de la mémoire principale mais
qui a un fonctionnement spécial.
• On rappelle que, dans le cas de la mémoire
principale, pour avoir accès à une donnée il suffit
d’avoir son adresse et le microprocesseur nous la
donne : c’est un mode d’accès ALEATOIRE (RANDOM
ACCESS MEMORY : RAM).
• Exemple pratique de pile : Une pile de livres est un
ensemble de livres superposés les uns sur les autres.
• Pour atteindre un certain livre, il faut enlever tous les
livres qui se trouvent dessus.
• Eh bien, c’est pareil pour la pile de mémoire qui est
une pile de données. alors pour enlever (dépiler) ou
déposer (empiler) des données dans la pile, le
microprocesseur utilise un de ses registres qui est fait
pour ça, appelé le Stack Pointer SP (pointeur de pile).
• C’est un registre de 16 bits qui contiendra l’adresse
de la dernière donnée dans la pile.
• Pour les processeurs actuels on utilise ESP (Extented
SP dit SP étendu et qui est un registre de 32 bits).
• ESP contient toujours l’adresse de la donnée du
sommet de la pile.
Objectifs
À la fin de cette presentation vous saurez comment
la pile est utilisée pour passer les paramètres aux
sous-programmes, effectuer l'allocation dynamique
des variables locales de ces sous-programmes. Pour y
arriver, vous devrez atteindre les objectifs suivants :
Comprendre les instructions push et pop.
Décrire les différents modes de passage des
paramètres
Décrire un bloc de pile
1) Empilement et dépilement
La plupart des microprocesseurs utilisent abandement la
pile, surtout pour le passage des paramètres aux sous-
programmes. On dispose de deux instructions pour
empiler et dépiler les données :
– push REGISTRE
– Où REGISTRE est un registre de taille 16 ou 32 bits.
– push ADRESSE
– Où ADRESSE est une adresse de taille 16 ou 32 bits.
– push CONSTANTE
– Où CONSTANTE est une valeur quelconque.
– En mode 32 bits, l'instruction push CONSTANTE a l'effet
suivant :
push 61h
Mémoire Mémoire
0 0
ESP
61
00
00
ESP 00
mov eax,0100h
Mémoire Mémoire
0 push eax 0
ESP
00
01
00
00
ESP
ESP
03
00
ESP
– Passage des paramètres aux sous-programmes (Fonction)
– Passage par la pile
– Soit le sous-programme Fonction(a, b, c). Ce sous-programme
est appelé comme suit :
–
– push a ESP
– push b APRES CALL @_retour ESP
c APRES RET
– push c b
– call Fonction a
esp dans
sous-programme &retour esp avant call
c et après ret
b
a
Explication de esp + 4
• 4 veut dire 4 octets;
• a, b et c ont 1 octet chacun;
• @_retour = 2 octets;
• Pour aller de esp à a on fait :
• esp + 2 (@_retour) + 1 (c) + 1 (b);
• Donc on aura esp + 4.
• 3) Blocs de pile
• Sous_programmeproc
• push ebp ; sauvegarde de ebp
• mov ebp,esp ; copie esp dans ebp
• push registre_1 ; on empile n registres
• ...
• push registre_n
• sub esp, 4n ; n variables locales
• …
• d’autres instructions du sous-programme
• …
• add esp,4 n ;on libére l’espace des n variables locales
De cette façon, 0
ebp fournit un
ESP après sub esp,4n
point fixe par 4n octets
pour
rapport auquel on variables
peut adresser les locales
esp après push registres
paramètres. On registres
ebp après
adresse les mov ebp, esp ebp
esp après push ebp
esp après call
variables locales @_retour
esp avant call
par rapport au param2
param1
pointeur de pile esp initial
• 3) Blocs de pile
• Accès aux paramètres
• 3) Blocs de pile
• Accès aux variables locales
• Dans la séquence d’instruction suivante, on déclare deux
variables locales i et j. La figure indique où elles sont placées et
le code indique comment on accède à i :
–Procedure proc
– LOCAL i: WORD
esp
– LOCAL j: DWORD i
j
• mov word ptr [ebp-6], 3 ; i = 3 ebp
ebp
• … @_retour
• ...
• Procedure endp
• 3) Blocs de pile
• Accès aux variables locales
• On peut référer à i et j par rapport à esp au lieu de ebp :
–sousProgramme proc
– LOCAL i: WORD
– LOCAL j: DWORD
• mov word ptr [esp], 3 ;i=3 esp
i
• mov dword ptr [esp+2], 4 ; j = 4 j
ebp
• … ebp
@_retour
• ...
• sousProgramme endp
• 3) Blocs de pile
• Accès aux variables locales
• On peut référer à i et j par nom. L’assembleur effectue la
traduction par rapport à ebp ou esp.
–sousProgramme proc
– LOCAL i: WORD
– LOCAL j: DWORD
• mov i, 3 ; i = 3 i
esp
• mov j, 4 ; j = 4 ebp
j
• … ebp
@_retour
• ...
• sousProgramme endp