Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Computer science 帧指针如何恢复到它指向的原始地址?_Computer Science - Fatal编程技术网

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