Wyjście zespołu GCC pustego programu na x86, win32

Piszę puste programy, aby denerwować piekielnych koderów stosu, NIE. Po prostu odkrywam łańcuch narzędzi gnu.

Teraz następujące rzeczy mogą być dla mnie zbyt głębokie, ale aby kontynuować pustą sagę programu, zacząłem badać dane wyjściowe kompilatora C, rzeczy, których używa GNU.

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 

Czy możesz wyjaśnić, co tu się dzieje? Oto mój wysiłek, aby to zrozumieć. Użyłemas podręcznik i moja minimalna wiedza na temat ASM x86:

.file "test.c" jest dyrektywą dla logicznej nazwy pliku..def: zgodnie z dokumentami„Rozpocznij definiowanie informacji o debugowaniu dla nazwy symbolu”. Co to jest symbol (nazwa funkcji / zmienna?) I jakiego rodzaju informacje debugowania?.scl: mówią doktorzy„Klasa pamięci może oznaczać, czy symbol jest statyczny czy zewnętrzny”. Czy to tak samostatyczny izewnętrzny Wiem z C? A co to jest „2”?.type: przechowuje parametr„jako atrybut typu wpisu tablicy symboli”, Nie mam pojęcia..endef: nie ma problemu..text: Teraz jest to problematyczne, wydaje się, że jest to coś o nazwie sekcja i przeczytałem, że to miejsce dla kodu, ale doktorzy nie powiedzieli mi zbyt wiele..globl „sprawia, że ​​symbol jest widoczny dla ld”., podręcznik jest dość jasny na ten temat._main: To może być adres początkowy (?) Dla mojej głównej funkcjipushl_: Długi (32-bitowy) push, który umieszcza EBP na stosiemovl: Ruch 32-bitowy. Pseudo-C:EBP = ESP;andl: Logiczne I. Pseudo-C:ESP = -16 & ESP, Tak naprawdę nie widzę sensu tego.call: Pcha adres IP na stos (więc wywoływana procedura może znaleźć drogę powrotną) i kontynuuje w miejscu__main jest. (co to jest __main?)movl: to zero musi być stałą, którą zwracam na końcu mojego kodu. MOV umieszcza to zero w EAX.leave: przywraca stos po instrukcji ENTER (?). Czemu?ret: wraca do adresu instrukcji zapisanego na stosie

Dziękuję za pomoc!

questionAnswers(5)

yourAnswerToTheQuestion