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.htm

    Offensichtlich 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.


Anmelden zum Antworten