Saída de montagem do GCC de um programa vazio em x86, win32

Eu escrevo programas vazios para aborrecer o inferno de codificadores stackoverflow, NÃO. Estou apenas explorando o toolchain do gnu.

Agora, o seguinte pode ser profundo demais para mim, mas para continuar a saga do programa vazio, comecei a examinar a saída do compilador C, o que o GNU consome.

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 

Você pode explicar o que acontece aqui? Aqui está o meu esforço para entender isso. Eu usei oas manual e meu conhecimento mínimo de ASM x86:

.file "test.c" é a diretiva para o nome de arquivo lógico..def: de acordo com os docs"Comece a definir informações de depuração para um nome de símbolo". O que é um símbolo (um nome / variável de função?) E que tipo de informação de depuração?.scl: docs say"A classe de armazenamento pode sinalizar se um símbolo é estático ou externo". Isso é o mesmoestático eexterno Eu sei de C? E o que é isso '2'?.type: armazena o parâmetro"como o atributo type de uma entrada de tabela de símbolos"Eu não tenho ideia..endef: sem problemas..text: Agora isso é problemático, parece ser algo chamado seção e eu li que é o lugar para o código, mas os documentos não me disseram muito..globl "torna o símbolo visível para ld.", o manual é bem claro sobre isso._main: Este pode ser o endereço inicial (?) Da minha função principalpushl_: Um longo (32bit) push, que coloca o EBP na pilhamovl: Movimento de 32 bits. Pseudo-C:EBP = ESP;andl: Lógica e. Pseudo-C:ESP = -16 & ESPEu realmente não vejo o que é isso.call: Empurra o IP para a pilha (assim o procedimento chamado pode encontrar o caminho de volta) e continua onde__main é. (o que é __main?)movl: esse zero deve ser a constante que eu retorno no final do meu código. O MOV coloca esse zero em EAX.leave: restaura a pilha após uma instrução ENTER (?). Por quê?ret: volta para o endereço de instrução que é salvo na pilha

Obrigado pela ajuda!

questionAnswers(5)

yourAnswerToTheQuestion