根据这篇文章:link
在这个简单的程序中:
void function(int a, int b, int c) {
char x[10];
}
void main() {
function(1, 2, 3);
}
我使用此命令获取程序集文件:
gcc -m32 -S -o example1.s example1.c
,这是函数(函数)的结果:
function:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $16, %esp
nop
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
我的问题是为什么这条线变成了:
subl $16, %esp
我希望它是:
subl $10, %esp
我使用kali linux 64
vendor_id:GenuineIntel
型号名称:Intel(R)Core(TM)i3 CPU M 350 @ 2.27GHz
架构:x86_64
CPU操作模式:32位,64位
字节顺序:Little Endian
答案 0 :(得分:2)
这实际上是堆栈对齐。
来自gcc(1)手册:
-mpreferred堆栈边界= NUM
尝试保持堆栈边界对齐2到num字节边界。如果未指定-mpreferred-stack-boundary,则默认值为4(16字节或128位)。
GCC正在对齐堆栈的基础,使其位于16字节边界上。
实际布局是:
x[9]
...
x[0]
padding[5]
...
padding[0] <-- $esp