Assembly EBP、ESP和组件中的堆栈框架
在下面的代码中,我有一些关于EBP、ESP和堆栈框架的问题Assembly EBP、ESP和组件中的堆栈框架,assembly,x86,nasm,calling-convention,stack-frame,Assembly,X86,Nasm,Calling Convention,Stack Frame,在下面的代码中,我有一些关于EBP、ESP和堆栈框架的问题 为什么我们要从esp中减去28?我们主要有两个局部变量x和y。那我们为什么不减去8呢 我们不是把值从右(或上)到左(或下)堆叠吗?那么为什么我们要在[eax+8]中添加1而不是[eax+4] 堆栈指针减去28,因为两个局部变量需要8个字节,func的参数需要12个字节。额外的8个字节可能是由于编译器试图将main的堆栈与16个字节的边界对齐(堆栈上已经有4个字节用于main的返回地址,当按下EBP以在main的第一条指令中建立堆
很明显,我和我的同事——cpu;)看起来这是用
gcc-facumulate outing args
编译的,以避免push
,而不是保留空间并使用相对于ESP的mov
。没有[eax+4]
或[eax+8]
寻址模式,也没有添加内存目标。如果你想把问题的这一部分编辑成一些有意义的东西,并与给出的答案相匹配,如果你能弄清楚8年前你在想什么,那可能是件好事。(或者如果其他人想要编辑。)
func(int a, int b, int c)
{
return a+b+c;
}
main()
{
int x, y=3;
x=func(y,2,1);
}