为了更好地掌握调用约定以及如何处理堆栈,我进行了一些尝试,但是我无法弄清楚为什么在设置堆栈时为什么主要分配三个额外的双字(在<main+0>
)。它没有对齐到8字节或16字节,所以这不是我所知道的原因。正如我所看到的,主要需要12个字节的两个参数func和返回值。堆栈分配,为什么多余的空间?
我错过了什么?
该程序是在x86架构上用“gcc -ggdb”编译的C代码。
编辑:我从gcc删除了-O0标志,它对输出没有任何影响。
(gdb) disas main
Dump of assembler code for function main:
0x080483d1 <+0>: sub esp,0x18
0x080483d4 <+3>: mov DWORD PTR [esp+0x4],0x7
0x080483dc <+11>: mov DWORD PTR [esp],0x3
0x080483e3 <+18>: call 0x80483b4 <func>
0x080483e8 <+23>: mov DWORD PTR [esp+0x14],eax
0x080483ec <+27>: add esp,0x18
0x080483ef <+30>: ret
End of assembler dump.
编辑:当然,我应该已经发布了C代码:
int func(int a, int b) {
int c = 9;
return a + b + c;
}
void main() {
int x;
x = func(3, 7);
}
该平台的Arch Linux的i686。
发布C代码可能会有所帮助 – 2012-03-25 17:02:11
由于您在询问有关调用约定的知识,因此该平台也很有用。例如,Mac OS X需要将堆栈保持对齐在16字节的边界上。 – 2012-03-25 17:07:21
最好假定当你禁用优化时,你最终会看到未优化的代码。 – 2012-03-25 17:49:20