使用以下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来编译。
答案 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?