首页 文章

Ebp,esp和堆栈框架与nasm组装

提问于
浏览
5

我在下面的代码中有一些关于ebp,esp和stack frame的问题 .

  • 为什么我们从esp中减去28?我们在main中有两个局部变量x和y . 那么为什么我们不减8?

  • 我们不是要把值从右到左叠加?那么为什么我们在[eax 8]而不是[eax 4]中添加1?

  • 我对这个结构有点困惑 . 你能帮我吗?谢谢 .

func(int a, int b, int c)
{
  return a+b+c;
}
main()
{
 int x, y=3;
 x=func(y,2,1);
}

Passing Parameters in Assembly

1 回答

  • 6
    • 堆栈指针减去28,因为两个局部变量需要8个字节,func参数需要12个字节 . 额外的8个字节可能是由于您的编译器's attempt to align main' s堆栈到16字节边界(当按下EBP以在main的第一个指令中 Build 堆栈帧时,返回地址为's already 4 bytes on the stack for main',另外4个字节) . 如果您正在使用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 Build 堆栈帧 .

    • 对哪个结构感到困惑?

相关问题