2010-12-13 4 views
3

Следующее изображение из википедии entry на стеке вызовов и есть то, что я совершенно не понимаю:Кадра указатель, EPB, и обратный адрес

alt text

Я думал указатель кадра, который хранится в EBP регистр инициализируется как таковой в прологе *:

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. 

Если это так, то не следует указатель кадра в изображении указывать на после обратного адреса и, прежде чем он должен быть предыдущий кадр ро inter address и перед этим обратный адрес? Что мне не хватает?

Спасибо!

* Взято из: What is exactly the base pointer and stack pointer? To what do they point?

ответ

5

Да, вы правы, указатель кадра указывает на адрес, где хранится предыдущий указатель кадра перед обратным адресом. Правильное изображение будет

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

Спасибо - это означает, что esp фактически не указывает на верхнюю часть стека, а на последний элемент в стеке? – SpeksETC

+0

@SpeksETC: последний элемент находится наверху стека – Abyx

0

Когда функция вызывается. Обратный адрес помещается в стек, и указатель стека теперь указывает на обратный адрес. Это то, что происходит внутри функции:

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 

Результат: EBP указывает на предыдущее значение EBP. ESP указывает еще 20 байтов от ESP. Эти 20 байтов будут использоваться для локальных варов.