El ensamblado de GCC de un programa vacío en x86, win32

Escribo programas vacíos para molestar a los programadores de stackoverflow, NO. Solo estoy explorando el gnu toolchain.

Ahora lo siguiente puede ser demasiado profundo para mí, pero para continuar con la saga de programas vacía, he comenzado a examinar la salida del compilador de C, lo que GNU consume.

gcc version 4.4.0 (TDM-1 mingw32)

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

¿Puedes explicar lo que pasa aquí? Aquí está mi esfuerzo por entenderlo. He usado elas Manual y mi conocimiento mínimo de ASM x86:

.file "test.c" Es la directiva para el nombre de archivo lógico..def: según los documentos"Comenzar a definir información de depuración para un nombre de símbolo". ¿Qué es un símbolo (un nombre de función / variable?) Y qué tipo de información de depuración?.scl: docs dice"La clase de almacenamiento puede marcar si un símbolo es estático o externo". Esto es lo mismoestático yexterno Lo sé por C? ¿Y qué es ese '2'?.type: almacena el parámetro"como el atributo de tipo de una entrada de tabla de símbolos", No tengo ni idea..endef: No hay problema..text: Ahora esto es problemático, parece ser algo llamado sección y he leído que es el lugar para el código, pero los documentos no me dijeron demasiado..globl "hace que el símbolo sea visible para ld"., el manual es bastante claro en esto._main: Esta podría ser la dirección de inicio (?) Para mi función principalpushl_: Un impulso largo (32 bits), que coloca el EBP en la pilamovl: Movimiento de 32 bits. Pseudo-C:EBP = ESP;andl: Lógica Y. Pseudo-C:ESP = -16 & ESP, Realmente no veo cuál es el punto de esto.call: Empuja el IP a la pila (para que el procedimiento llamado pueda encontrar su camino de regreso) y continúa donde__main es. (¿Qué es __main?)movl: este cero debe ser la constante que devuelvo al final de mi código. El MOV coloca este cero en EAX.leave: restaura la pila después de una instrucción ENTER (?). ¿Por qué?ret: vuelve a la dirección de instrucciones que se guarda en la pila

¡Gracias por tu ayuda!

Respuestas a la pregunta(5)

Su respuesta a la pregunta