我正在尝试学习 x86。(IA-32 架构)今天我学习了 Stack。我认为我理解的是:
StackPointer (SP) 指向堆栈的“顶部”(最小地址)并存储在 ESP 寄存器中。帧指针 (FP) 可以访问参数和局部变量,因为它是“弹出地址”,因此即使 SP 在堆栈内进一步移动也是静态的。
int addSome(int arg1, int arg2);
int main(void){
int answer = addSome(1,2);
}
int addSome(int arg1, int arg2){
return arg1 + arg2;
}
堆栈看起来应该是这样的:
如果有嵌套函数,FP 会发生什么情况?它不能上移,因为如果弹出子函数,将需要它的位置。
为了实现可视化,添加此函数,它将在 addSome() 内部调用:
int subSome(int arg3, int arg4);
int subSome(int arg3, int arg4){
return arg3 - arg4;
}
FP 在此处如何处理?如何知道新的“弹出地址”以及新参数的位置? 堆栈中的帧指针显示第一个函数的“弹出地址”,第二个函数未知
我的猜测是 addSome 的堆栈大小将被保存在某个地方,以获取相对于 FP 的新“弹出地址”的位置:
但是堆栈大小必须保存在某个地方,如果有更多的嵌套函数,就必须有更多的地方来存储这些大小,我认为这是不可能的。