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

时间:2013-01-06 18:34:37

标签: assembly nasm stackframe

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

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

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

  3. 我对这个结构有点困惑。你能帮我吗? THX。

    func(int a, int b, int c)
    {
      return a+b+c;
    }
    main()
    {
     int x, y=3;
     x=func(y,2,1);
    }
    
  4. Passing Parameters in Assembly

1 个答案:

答案 0 :(得分:7)

  1. 堆栈指针减去28,因为两个局部变量需要8个字节,func参数需要12个字节。额外的8个字节可能是由于您的编译器尝试将主堆栈与16字节边界对齐(堆栈上已有4个字节用于主要的返回地址,另外4个字节用于推送EBP以在main的第一个指令中建立堆栈帧)。如果您正在使用GCC,请参阅-mpreferred-stack-boundary

  2. 参数从右向左传递。由于堆栈空间在从堆栈指针中减去时已经为三个参数分配,因此1相对于当前堆栈指针(+8)移动到“最高”位置,2移动到中间(+4) ,y中的值被移入堆栈指针本身。这与在堆栈上按1,在堆栈上按2,然后在堆栈上按y相同。通过最后一个推送指令,1是来自ESP的+8,来自ESP的2是+4,来自ESP的y是+0。请注意,在func内部,它必须向这些偏移量添加8,因为返回地址是从调用指令推送到堆栈上的,并且func按下EBP以建立堆栈帧。

  3. 对哪个结构感到困惑?