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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top