GCCs Assembly-Ausgabe eines leeren Programms auf x86, win32

Ich schreibe leere Programme, um Stackoverflow-Codierer zu nerven, NICHT. Ich erforsche gerade die Gnu-Toolchain.

Das Folgende ist mir vielleicht zu tief, aber um die leere Programmsaga fortzusetzen, habe ich begonnen, die Ausgabe des C-Compilers zu untersuchen, das Zeug, das GNU verbraucht.

gcc version 4.4.0 (TDM-1 mingw32)

test.c:

int main()
{
    return 0;
}

gcc-S test.c

    .file   "test.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
.globl _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    call    ___main
    movl    $0, %eax
    leave
    ret 

Können Sie erklären, was hier passiert? Hier ist meine Bemühung, es zu verstehen. Ich habe das benutztas Handbuch und meine minimalen x86 ASM-Kenntnisse:

.file "test.c" ist die Direktive für den logischen Dateinamen..def: nach den docs"Beginnen Sie mit der Definition von Debugging-Informationen für einen Symbolnamen". Was ist ein Symbol (ein Funktionsname / eine Variable?) Und welche Art von Debugging-Informationen?.scl: docs sagen"Speicherklasse kann kennzeichnen, ob ein Symbol statisch oder extern ist". Ist das das selbe?statisch undextern Ich weiß von C? Und was ist das '2'?.type: speichert den Parameter"als Typattribut eines Symboltabelleneintrags", Ich habe keine Ahnung..endef: kein Problem..text: Nun, das ist problematisch, es scheint sich um einen so genannten Abschnitt zu handeln, und ich habe gelesen, dass dies der Ort für Code ist, aber die Dokumentation hat mir nicht zu viel gesagt..globl msgstr "macht das Symbol für ld sichtbar.", das Handbuch ist diesbezüglich recht übersichtlich._main: Dies könnte die Startadresse (?) Für meine Hauptfunktion seinpushl_: Ein langer (32bit) Push, der EBP auf den Stack legtmovl: 32-Bit-Verschiebung. Pseudo-C:EBP = ESP;andl: Logisches UND. Pseudo-C:ESP = -16 & ESPIch verstehe nicht wirklich, worum es geht.call: Schiebt die IP auf den Stack (damit die aufgerufene Prozedur zurückfindet) und fährt dort fort__main ist. (Was ist __main?)movl: Diese Null muss die Konstante sein, die ich am Ende meines Codes zurückgebe. Die MOV platziert diese Null in EAX.leave: Stellt den Stack nach einer ENTER-Anweisung wieder her (?). Warum?ret: Geht zurück zu der Anweisungsadresse, die auf dem Stapel gespeichert ist

Danke für deine Hilfe!

Antworten auf die Frage(5)

Ihre Antwort auf die Frage