为什么在此函数代码的序言中从堆栈指针中减去0x20?

时间:2012-11-17 12:25:02

标签: assembly x86 stack stack-pointer

void main(){
    int c;
    c = function(1, 2);
}

int function(int a, int b){
      char buf[10];
      a = a+b;
      return a;
}

汇编代码:

          main:
08048394:   push %ebp
08048395:   mov %esp,%ebp
08048397:   and $0xfffffff0,%esp
**0804839a:   sub $0x20,%esp   <-----------------------???????**
0804839d:   movl $0x2,0x4(%esp)
080483a5:   movl $0x1,(%esp)
080483ac:   call 0x80483b7 <function>
080483b1:   mov %eax,0x1c(%esp)
080483b5:   leave 
080483b6:   ret 
          function:
080483b7:   push %ebp
080483b8:   mov %esp,%ebp
080483ba:   sub $0x10,%esp
080483bd:   mov 0xc(%ebp),%eax
080483c0:   add %eax,0x8(%ebp)
080483c3:   mov 0x8(%ebp),%eax
080483c6:   leave 
080483c7:   ret 

我知道对齐16字节,
但是,在main(),int c(=4 byte) + 1(4byte) + 2(4byte) in function(1 ,2)调用语句中。

所以总和是12byte。但是通过内存对齐,我认为是16byte。

(sub 0x10, %esp)

为什么sub 0x20, %esp

1 个答案:

答案 0 :(得分:3)

考虑这个功能:

void main(){
    int c, d, e, f;
    c = function(1, 2, 3, 4);
    d =1;
    e = 2;
    f = 3;
}

这仍将分配0x20空间。

但是如果再添加1个局部变量或函数参数,它将立即分配0x30空间。

现在考虑main函数中什么都没有,但只有一个语句:

int c = 1;

然后在这种情况下,它将分配0x10空间。

你看到这里的模式了吗?系统首先为局部变量分配空间。然后它将为函数参数分配空间。分配的空间与0x10对齐。

这就是你看到0x20的原因。 0x10用于局部变量,另一个0x10用于函数参数。