2010-12-13 66 views
3

L'image suivante est de wikipedia entry sur la pile d'appels et il y a quelque chose que je ne comprends pas tout à fait:pointeur Frame, epb et adresse de retour

alt text

Je pensais que le pointeur de cadre qui est stocké dans le registre ebp est initialisé en tant que tel dans le prologue *:

push ebp ; Preserve current frame pointer 
mov ebp, esp ; Create new frame pointer pointing to current stack top 
sub esp, 20 ; allocate 20 bytes worth of locals on stack. 

Si oui, alors il ne faut pas le pointeur d'image dans l'image pointer vers après l'adresse de retour et avant qu'il ne devrait être le cadre précédent po inter adresse et avant que l'adresse de retour? Qu'est-ce que je rate?

Merci!

* Extrait de: What is exactly the base pointer and stack pointer? To what do they point?

Répondre

5

Oui, vous avez raison, points de pointeur de cadre à une adresse où est stocké le pointeur de l'image précédente, avant l'adresse de retour. L'image correcte serait

   | locals 
       +--------- 
frame pointer->| prev frame pointer 
       +-------- 
       | return address 
       +-------- 
+0

Merci - cela signifie-t-il que esp ne pointe pas réellement vers le haut de la pile mais vers le dernier élément de la pile? – SpeksETC

+0

@SpeksETC: le dernier élément est en haut de la pile – Abyx

0

Lorsque la fonction est appelée. L'adresse de retour est poussée sur la pile et le pointeur de la pile pointe maintenant sur l'adresse de retour. C'est ce qui se passe à l'intérieur de la fonction:

push ebp ; Push the ebp; The ebp address will pushed on stack and sp will be decremented 
mov ebp, esp ; EBP will now point the same as ESP which is previous value of EBP 
sub esp, 20 ; ESP will be subtracted further to create frame for local variables 

Le résultat est: EBP pointe à la valeur précédente de EBP. ESP pointe plus loin 20 octets de ESP. Ces 20 octets seront utilisés pour les variables locales.