Указатель кадра, epb и обратный адрес - PullRequest
3 голосов
/ 13 декабря 2010

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

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. 

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

Спасибо!

* Взято из: Что такое базовый указатель и указатель стека? На что они указывают?

Ответы [ 2 ]

6 голосов
/ 13 декабря 2010

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

               | locals
               +---------
frame pointer->| prev frame pointer
               +--------
               | return address
               +--------
0 голосов
/ 13 декабря 2010

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

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 байтов будут использоваться для локальных переменных.

...