Assembly x86: O que é o prólogo eo epílogo principal?
Pergunta
Eu estou seguindo este tutorial em x86 montagem. Cada exemplo até agora usa o que o autor chama de um programa de "c-piloto", compilado com o módulo de montagem, por meio de algum "inicialização". Algo como:
int main(void) {
int ret = asm_main();
return ret;
}
E, em seguida, a função asm_main está escrito normalmente, usando uma convenção de chamada C. Eu estou querendo saber o que exatamente é a inicialização necessária que está sendo gerado pelo compilador C, e se isso pode ser feito de uma forma portátil.
Infos:. Eu estou no Windows XP, a caixa de 32 bits, usando o assembler NASM e mingw32-gcc para ligar
Solução
A inicialização não é gerado pelo compilador c, é parte da biblioteca C (que o torna mais fácil de adaptar para cada OS / processador).
O código em questão é normalmente muito simples no Windows / sistemas UNIXy - normalmente faz um pouco de inicialização biblioteca (abre STDIN, STDOUT, STDERR, conjuntos fuso horário etc), configura o ambiente, processa a linha de comando para passar to main ; pega o retorno do main () e chamadas sair etc.
O código de arranque na maioria das bibliotecas C é em um arquivo chamado crt0.c, crt1.c ou algo semelhante (CRT = c tempo de execução).
Em sistemas mais primitivas ou nuas que também irá configurar a pilha e outros registos e limpar a área de dados BSS -., Neste caso, seria muitas vezes em assembler (tipicamente crt0.S)
Aqui está um link para o código do BSD c startup - ligação texto
E o código de arranque para mingw para Windows está em crt1.c aqui - http://mingw.cvs.sourceforge.net/viewvc/mingw/runtime/
Outras dicas
Você pode escrever seu no conjunto principal se quiser. Mas um monte de gente quer colocar depuração declarações no principal e aqueles que são mais fáceis em C do que em asm.
Se você escreveu principal em asm que você pode ter que lidar com principal realmente sendo chamado _main ou usando uma convenção alternativa chamada (especialmente no Windows) ou outras coisas estranhas assim que as alças do compilador C para você automaticamente ao gerar código para um função com o nome "main". Desta forma, faz com que você não tem que fazer isso.
A pilha, registros e arquivos seções (dados, rodata, BSS, etc) do programa têm de ser inicializado antes de main () é chamado. biblioteca de execução C (CRT) fornece este initialzsation.
CRT também fornece prólogo e epílogo código que é executado antes e depois de cada função é chamada. O código prólogo e epílogo atualiza os ponteiros de pilha e quadro.