Zrozumienie nowego prologu gcc

Zastanawiałem się, dlaczego gcc wprowadził nowy prolog (i epilog) również do funkcji - zwłaszcza main (), ponieważ tylko go analizowałem. Na przykład wcześniej było to:

push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack

; ... Some code

; Epilogue
leave
ret

Teraz jest to trochę bardziej skomplikowane (przynajmniej zrozumieć):

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

Rozumiem, co konkretnie robi, ale nie mogę zrozumiećcel, powód tego. Czy ma to na celu sprawienie, by próby wykorzystania (przepełnienie stosu) były nieco trudniejsze? Inna konwencja dzwonienia? Aby uczynić stos bezpieczniejszym? (Odkąd poznałem te rzeczy w grze wojennej)

Wreszcie moja wersja gcc to: gcc wersja 4.3.2 (Debian 4.3.2-1.1)

Z góry dziękuję!

questionAnswers(0)

yourAnswerToTheQuestion