我正在了解Wiki - Call stack上的堆栈指针和帧指针。
(部分:堆栈和框架指针): [“]在函数返回时,将堆栈指针恢复为框架指针,即函数调用之前堆栈指针的值。每个堆栈框架都包含[。“]
的堆栈指针。
我不了解的部分是,假设在过程调用$fp
指向地址$sp
指向调用之前,因此在调用之后我们知道如何恢复{{1 }},但是$sp
本身呢?
这是我关于问题的自制图表(图表中的堆栈应该从高地址到低地址):
答案 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
包含之前进行立即调用而言,这将是最近调用之前的帧指针。这会一直持续到调用堆栈,直到到达顶部(或使用其他调用约定找到自己)。