Como criar object files (código objeto) e linkar arquivos em Assembly

No tutorial passado de nossa apostila, ensinamos como criar um programa em Assembly, o famoso e simples "Hello world".

Lá, mostramos como criar o arquivo com a extensão asm.

Ao término deste tutorial, você irá aprender como transformar esse arquivo em executável, e executá-lo.



Como transformar um arquivo .asm em executável

Agora precisamos converter nosso código em Assembly, que é feito e entendido por nós humanos, para a linguagem de máquina, que é a linguagem que o computador realmente entende e roda.

Isso se faz em dois passos:

  • Criar o object file, que pega o .asm e cria, a partir dele, um arquivo com a extensão .o
  • Linkar nosso programa, fazendo com que o código-objeto se torne em um executável
Vamos ensinar como fazer isso utilizando o assembler NASM, no sistema operacional Linux.
Um importante detalhe: dependendo da arquitetura de seu sistema, 32 bits ou 64 bits, os comandos diferem um pouco, mas ensinaremos como trabalhar em ambos casos.

Como criar o object file em Assembly

Agora vamos criar o arquivo com extensão .o, que é o objeto (resultado da transformação do código para código de máquina).


Para isso, vamos finalmente usar o nasm.

Como Assembly é baixo níveo, o código vai se diferenciar levemente caso você use 32 ou 64 bits, mas nosso tutorial de Assembly vai explicar você a rodar seus programas em ambas arquiteturas.



Caso seja 32 bits, vá no diretório do hello.asm e digite o seguinte código no terminal:

nasm -f hello.asm


Caso seja 64 bits, digite:

nasm -f elf64 hello.asm


Se você notar bem, foi criado um arquivo com extensão .o, é o arquivo-objeto hello.o

























Como linkar arquivos em Assembly

O próximo passo é a linkagem, onde vamos transformar o(s) códigos objeto de nossos programas para torná-los executáveis.

Vamos usar o comando ld para isso.



32 ou 64 bits:

ld hello.o -o hello


Pronto, agora você tem seu arquivo executável "hello". Para rodá-lo, digite o comando a seguir, que deve mostrar uma mensagem na tela:

./hello


O resultado desses passos é:



Curso de Assembly online grátis





Como rodar o código Assembly - Tutorial Alternativo

Uma outra maneira de fazer todo esse processo é a seguinte:



1. Criar o código-objeto:

nasm -f hello.asm




2. Linkando



32 bits:

ld hello.o -o hello



64 bits:

ld -m elf_i386 hello.o -o hello

7 comentários:

Zanco disse...

Boa tarde.
Seguindo o tutorial, o comando
ld -m elf_i386 hello.o -o hello

retorna:
'ld' não é reconhecido como um comando interno ou externo, um programa operável ou um arquivo em lotes.

Anônimo disse...

O bloco de notas salva o arquivo como hello.asm.txt, se você digitar apenas hello.asm dá o erro 'nasm: fatal: unable to open input file `hello.asm'. Pelo menos foi assim comigo...

Fred disse...

Você ensina a fazer isso em um sistema Linux, como eu faria usando um Windows 10?

Renan disse...

Olá. O Comando id/Id não foi reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

O que isso significa?

Isso é válido para o Linux apenas?

Delevick disse...

no windows o ld não funciona, somente a opcão de 32 bits, mas da seguinte forma, "hello.o -o hello" pois o ld e do linux... bom pra mim funcionou pois eu tentei algumas vezes todas deram certo dessa forma inclusive com outros nomes de arquivo

Anônimo disse...

Na hora de criar o executável, tente fazer assim: Id -m elf_i386 hello.o -o hello.exe
Eu uso o gcc do mingw com C no Windows, a diferença é que normalmente tanque pôr a extensão ".exe" para o sistema saber que é uma executável.

Anônimo disse...

Não é Id com i, tente com L, ld.

Veja também: