Ich spielte etwas herum, um die Aufrufkonventionen besser zu verstehen und wie der Stack gehandhabt wird, aber ich kann nicht herausfinden, warum main beim Einrichten des Stacks drei zusätzliche Doppelwörter zuweist (um <main+0>
). Es ist weder auf 8 Bytes noch auf 16 Bytes ausgerichtet, weshalb ich nicht weiß, warum. Wie ich es sehe, benötigt main 12 Byte für die beiden Parameter func und den Rückgabewert.Stack-Zuweisung, warum der zusätzliche Platz?
Was fehlt mir?
Das Programm ist C-Code kompiliert mit "gcc -ggdb" auf einer x86-Architektur.
Edit: Ich entfernte die -O-Flag von gcc, und es machte keinen Unterschied für die Ausgabe.
(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.
Edit: Natürlich sollte ich den C-Code geschrieben haben:
int func(int a, int b) {
int c = 9;
return a + b + c;
}
void main() {
int x;
x = func(3, 7);
}
Die Plattform ist i686 Arch Linux.
Es könnte hilfreich sein, den C-Code –
zu posten Die Plattform wäre auch nützlich, da Sie nach Aufrufkonventionen fragen. Mac OS X erfordert beispielsweise, dass der Stapel auf 16-Byte-Grenzen ausgerichtet bleibt. –
Es ist am besten anzunehmen, dass beim Deaktivieren von Optimierungen am Ende unoptimierter Code angezeigt wird. –