为什么我的堆栈指针只增加16的倍数?

时间:2011-03-31 06:29:09

标签: assembly x86

使用以下C代码

void func() {
  int a=1,b=2,c=3;
}

使用gcc -S -O -o- myfile.c进行编译我得到了输出

    .file   "myfile.c"
    .intel_syntax noprefix
    .text
.globl func
    .type   func, @function
func:
    push    ebp
    mov ebp, esp
    sub esp, 16
    mov DWORD PTR [ebp-4], 1
    mov DWORD PTR [ebp-8], 2
    mov DWORD PTR [ebp-12], 3
    mov DWORD PTR [ebp-16], 4
    mov DWORD PTR [ebp-20], 5
    leave
    ret
    .size   func, .-func
    .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
    .section    .note.GNU-stack,"",@progbits

我希望func:之后的第三行是sub esp,12而不是sub esp,16。我在函数中使用了不同数量的自动变量,发现它以16字节为增量增长。为什么会这样?这是在所有平台上发生,还是特定于平台?

我目前正在使用OSX运行Intel Mac,使用GCC通过Ubuntu(32位)VirtualBox来编译。

3 个答案:

答案 0 :(得分:9)

来自GCC man page,(大胆强调我的):

  

<强> -mpreferred堆栈边界= NUM​​

     

尝试保持堆栈边界对齐2到num字节边界。如果未指定-mpreferred-stack-boundary,则默认值为4(16字节或128位)

答案 1 :(得分:2)

这是非常奇怪的输出。

您确定c文件不是:

void func() {
  int a=1,b=2,c=3,d=4,e=5;
}

否则为什么行

mov DWORD PTR [ebp-16], 4
mov DWORD PTR [ebp-20], 5

答案 2 :(得分:2)

x86_64 ABI要求堆栈为16字节对齐

Stack allocation, padding, and alignment

对于32位OS X,由于SSE和其他一些原因,它会这样做

Why does the Mac ABI require 16-byte stack alignment for x86-32?