2010-12-13 15 views
3

Das folgende Bild ist von wikipedia entry auf Call-Stack und es ist etwas, das ich nicht verstehe vollständig:Rahmenzeiger, EPB und Rücksendeadresse

alt text

Ich dachte, den Rahmen-Pointer, die gespeichert wird in EBP-Register als solche im Prolog * initialisiert:

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. 

Wenn ja, sollte dann nicht der Rahmenzeiger im Bild nach der Rückkehr-Adresse sein und zeigt, bevor es sollte der vorherige Rahmen po sein Interadresse und davor die Absenderadresse? Was vermisse ich?

Danke!

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

Antwort

5

Ja, Sie haben Recht, Rahmenzeiger auf eine Adresse in dem vorherigen Rahmenzeiger gespeichert wird, vor der Rückkehr-Adresse. Das richtige Bild würde

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

Danke - Bedeutet dies, dass esp nicht wirklich auf den Anfang des Stapels, sondern auf das letzte Element im Stapel zeigt? – SpeksETC

+0

@SpeksETC: Letztes Element ist oben im Stapel – Abyx

0

werden, wenn die Funktion aufgerufen wird. Die Rücksprungadresse wird auf den Stapel geschoben und der Stapelzeiger zeigt nun auf die Rücksprungadresse. Dies ist, was in der Funktion geschieht:

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 

Das Ergebnis ist: EBP zum vorherigen Wert von EBP zeigen. ESP zeigt weitere 20 Bytes von ESP an. Diese 20 Bytes werden für lokale vars verwendet.