Aufruf von int main(){return 0;} mit gcc 4.1.1
-
Bitte um konstruktive Kritik:
http://www.henkessoft.de/C/C-Programming%20Under%20The%20Hood.htmOffensichtlich verfolgt der GCC 4.1.1 ein neues (an "x64" angelehntes) Paradigma:
00401349 mov DWORD PTR [esp+0x8],0xfffffff2 00401351 mov DWORD PTR [esp+0x4],0xfffffff4 00401359 mov DWORD PTR [esp],0x2a 00401360 call 0x401318 <doSomething>
Argumente werden nicht (wie üblich) via PUSH auf den Stack "gepushed", sondern direkt in den Stack geschrieben. Da wäre es m.E. sinnvoller, den "Verbleib" der Argumente im Stack des Callee nicht nur via [EPB + X], sondern auch via [ESP + X] aufzuzeigen. Beinahe hätte ich noch vermutet, daß der Callee den EBP-basierten Prolog/Epilog nicht mehr hat. Hmmm, aber wie man sich doch täuschen kann.
-
merker schrieb:
... Beinahe hätte ich noch vermutet, daß der Callee den EBP-basierten Prolog/Epilog nicht mehr hat. Hmmm, aber wie man sich doch täuschen kann.
Wenn ich richtig verstanden habe, was Du meinst, müsste es mit dem gcc Compiler Parameter -fomit-frame-pointer einstellbar sein...
-
-fomit-frame-pointer <--- hatte in diesem Fall keinen Einfluss, probiert es aus.
-
Hmmmm, dann war das wohl nix mit Paradigma.
"MOV [ESP+X], ..." statt "PUSH ..." soll wohl nur eine Optimierung auf Geschwindigkeit sein.
-
push und mov können nicht das gleiche (m2m)
-
Erhard Henkes schrieb:
-fomit-frame-pointer <--- hatte in diesem Fall keinen Einfluss, probiert es aus.
Das liegt daran, dass die Datei als Debug gebaut wird. Man muss als Release bauen, mit dem gcc Parameter -g0.