我在下面的代码中有一些关于ebp,esp和stack frame的问题。
为什么我们从esp中减去28?我们在main中有两个局部变量x和y。那么为什么我们不减8?
我们不是要把值从右到左叠加?那么为什么我们在[eax + 8]而不是[eax + 4]中添加1?
我对这个结构有点困惑。你能帮我吗? THX。
func(int a, int b, int c)
{
return a+b+c;
}
main()
{
int x, y=3;
x=func(y,2,1);
}
答案 0 :(得分:7)
堆栈指针减去28,因为两个局部变量需要8个字节,func参数需要12个字节。额外的8个字节可能是由于您的编译器尝试将主堆栈与16字节边界对齐(堆栈上已有4个字节用于主要的返回地址,另外4个字节用于推送EBP以在main的第一个指令中建立堆栈帧)。如果您正在使用GCC,请参阅-mpreferred-stack-boundary。
参数从右向左传递。由于堆栈空间在从堆栈指针中减去时已经为三个参数分配,因此1相对于当前堆栈指针(+8)移动到“最高”位置,2移动到中间(+4) ,y中的值被移入堆栈指针本身。这与在堆栈上按1,在堆栈上按2,然后在堆栈上按y相同。通过最后一个推送指令,1是来自ESP的+8,来自ESP的2是+4,来自ESP的y是+0。请注意,在func内部,它必须向这些偏移量添加8,因为返回地址是从调用指令推送到堆栈上的,并且func按下EBP以建立堆栈帧。
对哪个结构感到困惑?