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

Mar*_*oms 5 x86 assembly

使用以下C代码

void func() {
  int a=1,b=2,c=3;
}
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

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

typ*_*.pl 9

来自GCC手册页,(大胆强调我的):

-mpreferred堆叠边界= NUM

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

  • @vidstige @Martin:或者他们崩溃了,即使是在x86上(参见movaps,例如). (2认同)