帧指针如何恢复到其指向的原始地址?

时间:2018-11-27 03:10:58

标签: computer-science

我正在了解Wiki - Call stack上的堆栈指针和帧指针。

  

(部分:堆栈和框架指针): [“]在函数返回时,将堆栈指针恢复为框架指针,即函数调用之前堆栈指针的值。每个堆栈框架都包含[。“]

的堆栈指针。

我不了解的部分是,假设在过程调用$fp指向地址$sp指向调用之前,因此在调用之后我们知道如何恢复{{1 }},但是$sp本身呢?

这是我关于问题的自制图表(图表中的堆栈应该从高地址到低地址):

stack pointer 2

1 个答案:

答案 0 :(得分:3)

通常,帧指针(或通常更正确的是上一个帧指针)也被压入堆栈,因此可以通过简单的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包含之前进行立即调用而言,这将是最近调用之前的帧指针。这会一直持续到调用堆栈,直到到达顶部(或使用其他调用约定找到自己)。