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 & ESP
Eu 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 pilhaObrigado pela ajuda!