【发布时间】:2016-03-03 13:42:18
【问题描述】:
来自这个网站: 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);
}
内存如下图所示:
我不明白为什么基指针从堆栈中获取内存,它不能像堆栈指针一样存储在寄存器中,只是指向他需要的地方吗? (我知道当stackpointer进行push和pop时,基指针用于更容易找到变量,但我不明白为什么它的值存储在堆栈中,而不仅仅是寄存器中!),非常感谢您的帮助(恐怕我错过了一些非常重要的东西)
编辑: 可能这更有助于我的困惑:在图像中,它们显示“EBP”(寄存器)和“保存的 ebp”。我不明白为什么有两个...
【问题讨论】:
-
为什么返回地址必须存储在堆栈中,而不仅仅是寄存器中?
-
我了解到basepointer已经有一个寄存器EBP了,但是返回地址没有。在图像中,它们显示“EBP”(寄存器)和“保存的 ebp”。我不明白为什么有两个...
-
基/帧指针像链表一样工作; EBP指向当前基指针,当前基指针指向前一个基指针,以此类推。
-
返回地址在调用前后肯定有一个寄存器,即程序计数器(PC)或指令指针(IP)——名称因架构而异。除非您正在执行一些面向继续的调用,否则返回地址只不过是“保存的程序计数器”,它有助于在被调用函数返回时在调用者中恢复执行。
-
@Melak47 这很有意义......如果你有时间把它放在答案中,我想我应该投票给你
标签: c++ c compilation