Escribo programas vacíos para molestar a los codificadores de stackoverflow, NO. Solo estoy explorando la cadena de herramientas gnu.Salida de conjunto de GCC de un programa vacío en x86, win32
Ahora lo siguiente puede ser demasiado profundo para mí, pero para continuar la saga de programa vacía, he comenzado a examinar la salida del compilador de C, lo que GNU consume.
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
Puede explicar lo que pasa aquí? Aquí está mi esfuerzo por entenderlo. He utilizado el manual as
y mi conocimiento mínimo x86 ASM:
.file "test.c"
es la Directiva para el nombre de archivo lógico..def
: de acuerdo con los documentos "Comenzar a definir la información de depuración para un nombre de símbolo". ¿Qué es un símbolo (un nombre/variable de función?) Y qué tipo de información de depuración?.scl
: docs say "La clase de almacenamiento puede marcar si un símbolo es estático o externo". ¿Es este el mismo estático y externo Lo sé de 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 dicen demasiado..globl
"hace que el símbolo sea visible para ld.", el manual es bastante claro al respecto._main:
Esta podría ser la dirección inicial de mi función principalpushl_
(?): Una larga (32 bits) de empuje, lo que sitúa EBP en la pilamovl
: 32 bits movimiento. Pseudo-C:EBP = ESP;
andl
: lógico AND. Pseudo-C:ESP = -16 & ESP
, realmente no veo cuál es el sentido de esto.call
: Empuja la dirección IP a la pila (para que el procedimiento llamado pueda encontrar su camino de regreso) y continúa donde está__main
. (¿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
: se remonta a la dirección de la instrucción que se guarda en la pila
Gracias por su ayuda!
Buena pregunta. :) –
Suena como un excelente ejercicio para un verdadero geek. – JesperE
Encontré la especificación COFF. Esto debería dar algunas referencias a lo que "32" en ".type" significa, etc.: http://www.microsoft.com/whdc/system/platform/firmware/PECOFFdwn.mspx –