Как указатель кадра восстанавливает исходный адрес, на который он указывал? - PullRequest
0 голосов
/ 27 ноября 2018

Я читаю о указателе стека и указателе фрейма на Wiki - Стек вызовов .

(Раздел: Указатели стека и фрейма): ["] Впри возврате функции указатель стека вместо этого восстанавливается до указателя фрейма, значение указателя стека непосредственно перед вызовом функции. Каждый фрейм стека содержит указатель стека на верхнюю часть фрейма, расположенного непосредственно ниже. [. "]

Часть, которую я не понимаю, предполагает, что во время вызова процедуры $fp указывают на адрес $sp, указывают на до вызова, поэтому после вызова мы знаем, как восстановить $sp, но как насчет самого $fp?

Вот мой самодельный график о моей проблеме (в моем графике стек должен расти с высокого адреса на низкий адрес):

stack pointer 2

1 Ответ

0 голосов
/ 27 ноября 2018

Обычно указатель кадра (или, как правило, и более правильно, предыдущий указатель кадра) также помещается в стек, поэтому его можно восстановить с помощью простой инструкции pop.

Например, вот функция в x86 с прологом и эпилогом (ebp - указатель кадра):

push    ebp                   ; push current frame pointer
mov     ebp, esp              ; set up frame pointer for this new frame
sub     esp, <frameSize>      ; allocate stack space (locals)

weave   magic                 ; the meat of the function

mov     esp, ebp              ; deallocate stack space
pop     ebp                   ; restore previous frame pointer
ret                           ; back to caller

В терминах того, что $fp содержало до , что делает немедленныйcall, это будут указатели фреймов для самого последнего вызова до этого.И это продолжается до самого стека вызовов, пока вы не достигнете вершины (или не обнаружите, что используете другое соглашение о вызовах).

...