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 & ESP
Ich 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 istDanke für deine Hilfe!