gpt4 book ai didi

c++ - 为什么基指针值存储在堆栈中

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:40 25 4
gpt4 key购买 nike

从这个网站: http://eli.thegreenplace.net/2011/02/04/where-the-top-of-the-stack-is-on-x86/我看到这个程序堆栈:

int foobar(int a, int b, int c)
{
int xx = a + 2;
int yy = b + 3;
int zz = c + 4;
int sum = xx + yy + zz;

return xx * yy * zz + sum;
}

int main()
{
return foobar(77, 88, 99);
}

在内存中看起来像下图:

enter image description here

我不明白基指针为什么要从栈中拿内存,难道不能像栈指针那样,直接存放在寄存器中,指向他需要的地方吗? (我知道基指针用于在堆栈指针进行压入和弹出时更容易找到变量,但我不明白为什么它的值存储在堆栈中,而不仅仅是寄存器中!),非常感谢您的帮助(恐怕我错过了一些非常重要的东西)

编辑:可能这有助于更多我的困惑:在图像中,它们显示“EBP”(寄存器)和“保存的 ebp”。不明白为什么会有两个...

最佳答案

首先,您应该意识到这种风格的堆栈框架不再是真正需要的。大多数当前的编译器可以(并且确实)消除了在堆栈上保存 [E]BP 以及在函数入口处将 [E]SP 复制到 [E]BP 的情况。有一次(16 位代码)这是需要的,因为 BP 可以充当基址寄存器,但 SP 不能。这意味着您不能执行 -7[SP] 之类的操作,但可以执行 -7[BP]。然而,对于 386 位和 32 位代码,情况已不再如此——您可以使用 ESP(或任何其他寄存器)作为基址寄存器。

尽管如此,仍然有一些理由在进入过程/函数时保存 EBP:除非堆栈被破坏,否则它真的很容易走。 EBP 指向 EBP 的前一个值,EBP 指向前一个值,依此类推堆栈。如果您正在调试(例如),这使得进行堆栈跟踪变得非常容易。如果您必须遍历一些没有符号的代码,您可以遍历它们,找到您理解的早期堆栈帧,并详细检查它们。

相比之下,如果您直接使用 ESP,它会在进入函数时进行调整,以便为该函数的局部变量腾出空间。您需要知道调整了多少才能返回到先前的堆栈帧。如果你到达一个你没有信息的点,并且你不知道在进入该函数时 ESP 被调整了多少,你几乎被困住了(没有反汇编代码来找到堆栈调整,所以你可以取消它)。

关于c++ - 为什么基指针值存储在堆栈中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com