爲了更好地掌握調用約定以及如何處理堆棧,我進行了一些嘗試,但是我無法弄清楚爲什麼在設置堆棧時爲什麼主要分配三個額外的雙字(在<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