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!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage