Den neuen gcc-Prolog verstehen
Ich habe mich gefragt, warum gcc einen neuen Prolog (und auch einen neuen Epilog) für Funktionen eingeführt hat - insbesondere main (), da ich ihn nur analysiert habe. Zum Beispiel war es vorher:
push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack
; ... Some code
; Epilogue
leave
ret
Das ist etwas komplexer (zumindest zu verstehen):
lea ecx,[esp+0x4]
and esp,0xfffffff0
push DWORD PTR [ecx-0x4]
push ebp
mov ebp,esp
push ecx
sub esp,0x64
; Some code
; Epilogue
add esp,0x64
pop ecx
pop ebp
lea esp,[ecx-0x4]
ret
Ich verstehe, was es konkret macht, aber ich kann das nicht herausfindenZweck davon. Ist es etwas kniffliger, die Ausnutzung (Stapelüberlauf) zu erschweren? Noch eine Calling Convention? Nur um den Stapel sicherer zu machen? (Da ich dieses Zeug in einem Kriegsspiel getroffen habe)
Schließlich ist meine gcc-Version: gcc-Version 4.3.2 (Debian 4.3.2-1.1)
Danke im Voraus!