Computer science 帧指针如何恢复到它指向的原始地址?
我正在阅读关于堆栈指针和帧指针的文章 (节:堆栈和帧指针):[“]在函数返回时,堆栈指针将恢复为帧指针,即调用函数之前堆栈指针的值。每个堆栈帧包含一个指向紧接其下的帧顶部的堆栈指针。[。”] 我不理解的部分是,假设在过程调用期间,Computer science 帧指针如何恢复到它指向的原始地址?,computer-science,Computer Science,我正在阅读关于堆栈指针和帧指针的文章 (节:堆栈和帧指针):[“]在函数返回时,堆栈指针将恢复为帧指针,即调用函数之前堆栈指针的值。每个堆栈帧包含一个指向紧接其下的帧顶部的堆栈指针。[。”] 我不理解的部分是,假设在过程调用期间,$fp指向调用前的地址$sp,那么调用后我们知道如何恢复$sp,但是$fp本身呢 这是我自己制作的关于我的问题的图表(我的图表中的堆栈应该从高地址增长到低地址): 通常,帧指针(或者,通常更准确地说,前一帧指针)也被推送到堆栈上,因此可以通过简单的pop指令恢复 例如,
$fp
指向调用前的地址$sp
,那么调用后我们知道如何恢复$sp
,但是$fp
本身呢
这是我自己制作的关于我的问题的图表(我的图表中的堆栈应该从高地址增长到低地址):
通常,帧指针(或者,通常更准确地说,前一帧指针)也被推送到堆栈上,因此可以通过简单的
pop
指令恢复
例如,这里有一个x86中带有prolog和epilog的函数(ebp
是帧指针):
push-ebp;推送当前帧指针
mov-ebp,esp;为此新帧设置帧指针
副esp;分配堆栈空间(局部)
编织魔法;功能的核心
mov-esp,ebp;释放堆栈空间
pop-ebp;恢复上一帧指针
ret;返回给来电者
就立即调用之前包含的内容而言,它将是在此之前最近一次调用的帧指针。这会一直持续到调用堆栈的顶部(或者发现自己使用了不同的调用约定)。谢谢。我可以问你另一个与我的头衔无关的问题吗,在打电话之前,
$fp
指向的地址是什么?我将画一幅图,并编辑我的问题。@ptr_user7813604,它是海龟,一路向下:-)或者更准确地说,是之前的帧指针(至少在你到达顶层之前,然后是在我们开始制作帧之前发生的任何事情ebp
)因此,我的逻辑是否正确:每个过程调用都需要一些空间,称为堆栈帧,一些指针包括两个名为$sp
和$fp
的指针,每一个这样的$fp
都指向上一个堆栈框架的顶部?非常感谢您,先生,我认为您一定写了一个非常好的答案,但我目前的水平无法理解您提供的代码片段的含义。但别担心,我会在我有能力的时候审查它。@ptr_user7813604:正是这样。每个堆栈帧包含当前级别的足够信息,包括如何返回到上一级别。
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