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

18 comentários:

steniovm disse...

parabens pelo curso.
já tinha visto um pouco de assemble quando estava estudando arquitetura mips, mas aqui realmente é um conhecimento bem mais solido.
só tenho uma suguestão. eu, e acredito que muitos outros usuarios tambem, infelizmente tenho disponivel um PC com windows pra fazer esse curso. ao se postar um comando de bash (como o ld ou ./) poderia postar tambem o equivalente pra DOS, até mesmo por coerencia, já que voces ensinaram a instalar o nasm no windows.
muito obrigado

Pedro Moreno disse...

Realmente, um curso bem fundamentado de assembly era o que faltava. Estou gostando bastante dos ensinamentos...

Gostaria de solicitar apenas que, quando fizerem algum passo no linux, se possivel fazer no windows, pois nem todos usam linux. Por exemplo nesta etapa de como transformar um arquivo .asm em executável, não consegui pegar as informações por ser usuário do windows.

Obrigado mais uma vez, e força para continuar o grande trabalho.

Rafael Magalhães disse...

Bom dia! Tentei fazer o programa mas quando eu escrevi "ld -m elf_i386 hello.o hello" retornou o erro: "'ld' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes." Meu sistema é 64bitts. Outra coisa não consigo visualizar o arquivo .o Valeu

Curso Assembly Progressivo disse...

Que sistema operacional está usando, Rafael?

Pedro h disse...

Boa noite, consegui gerar o arquivo.o, mais quando vou pra segunda parte, aparece uma mensagem dizendo que o formato do arquivo hello.o não é reconhecido.

André Jurizato disse...

Bom dia para todos.
Estou tentando realizar todos os primeiros passos para começar à programar em assembly. Segui todos os passos para instalar corretamente o NASM no Windows. E conforme apareceu uma grande lista de instruções no cmd, com o comando: nasm -h, acho então que foi instalado corretamente. Daí pra frente, não consegui fazer mais nada. Já criei um arquivo de texto do primeiro programs Hello.asm. Mas na janela DOS do NASM sempre aparece o mesmo erro igual: ""nasm: fatal: unable to open input file `hello.asm"" para tudo que digito. ATÉ AGORA, NÃO CONSEGUI TER SUCESSO EM NENHUM COMANDO INDICADO PARA ESTAR DIGITANDO NA JANELA DO DOS COM O NASM. OU ENTÃO, PODE SER EU QUE ESTOU FAZENDO ALGO ERRADO E/OU INCORRETO. MEU SISTEMA É: WINDOWS 7 ULTIMATE x64 Bits. Valeu.

Carlos Henrique Barros disse...

Como linkar arquivos em Assembly no Windows XP?

juca disse...

Pessoal do blog, ou respondam as dúvidas ou eliminem esta página. O passo a passo de vocês não está funcionando para ninguém, como já deu para notar nos comentários. Não há nenhum arquivo ld no pacote do assembler para windows, ou seja, essa linha de comando não vai rodar nunca.

Curso Assembly Progressivo disse...

Juca,

É deixado bem claro no início do tutorial: "Vamos ensinar como fazer isso utilizando o assembler NASM, no sistema operacional Linux."

LINUX

Quem não conseguiu foi porque está tentando fazer os passos no Windows. Não são os passos pro Windows, são os comandos pro LINUX.

Embora tenhamos ensinado a instalar o NASM no Windows, este tutorial aqui é para fazer no Linux...e, realmente, se você der os comandos do Linux no Windows, não vai rodar nunca.

E não, não vamos eliminar a página.
O site é atualizado aos poucos, quando os autores tiverem tempo, se não gostar fique a vontade para visitar outro site.

Anônimo disse...

acho que ld file
nao da pra fazer no windows, mas instalar o nasm com certeza dá!
Quem usa windows vai ter que achar um 'substituto' se tiver, pro ld.

Paulo disse...

Estou tentando fazer com gcc no win.... Mas ate agora não conseguir... =(

Usando o comando

nasm -f win32 hello.asm -o hello.o
gcc hello.o

e o gcc para linkar... Ate consigo gerar o executável, mas não executa nada.. kkk

Então acho q terei que mudar para o linux.

Aproveitando tem alguma diferença entre usar o comando gcc ou ld para gerar o executável??

Rodrigo (Spark) disse...

Comecei a acompanhar o site agora. Vai me ajudar muito.
Vlw ae pela força, abçs.

Tudo funcionando por aqui, estou usando Fedora x64

Julian de Paula disse...

cara, comigo não deu certo assim.

fiz o arquivo .asm, mas ele não gerou o arquivo .o com o comando nasm -f hello.asm. retornava a msg "output invalid" ou algo assim. então, na duvida, achando que talvez meu sistema fosse 64 (processador dual core pentium, que pra mim é x86) e ele gerou o .o. mas quando tentei aplicar o ld deu erro de novo.
então chutei jogar o codigo nasm -f elf32.asm, e deu certo, gerou o .0e foi tudo em frente. mas não com o comando que ai está e sim com esse nasm -f elf32 que eu chutei pra ver que bicho que dava

0x0101a55f disse...

ASM Progressivo,

Só uma dúvida: Se você programam em ASM, obviamente você o conhece em Windows certo? Se a resposta for positiva, me surge uma dúvida: Porque não colocou alternativa para plataforma Windows? Desculpe, mas ficou parecendo aqueles pré-adolescentes que instalaram o Ubuntu e pregam o 'AntiWindowsismo' por aonde passam.

Minha sugestão é que você coloque o comando alternativo para Windows, ou então adicione outro assembler (Zeus, o próprio pacote da Microsofot, o... MVS), porque a maioria das pessoas que frequentam o seu site são usuários Windows, não Linux. Eu particularmente desejo me aprofundar em ASM (mais precisamente nas funções dos registradores e na lógica dessa linguagem que me deixa confuso) para alterar algumas funções de um MMORPG aqui.

De qualquer forma, seu site está de parabéns, pois como você mesmo mencionou: São poucas as fontes sobre ASM de qualidade que estão em português (posso até citar algumas se usted desejar para aprimorar o conhecimento dos seus alunos); boa iniciativa.

Att;

0x0101a55f

elimoraissilva disse...

Bom, tava dando errado aqui pra mim por que meu i5 é 64 bits, troquei o comando ensinado no tuto
ld -m elf_i386 hello.o -o hello
por este:
ld -m elf_x86_64 hello.o -o hello
Aí funfou de boa... valeu por enquanto...

Douglas disse...

Gostei muito do site e da oportunidade que ele dá. Acabei de compilar o codigo mencionado. No entanto ele só roda no Linux. O que é preciso pra ele rodar sem depender de OS nenhum? Tipo, a hora do boot. Eu coloco ele no primeiro setor do hd ou disquete e na hora do boot quando a BIOS entregar o controle pro dispositivo o programa já começa a rodar. Igual acontece com o memtest. Se colocar aquele arquivo no inicio do dispositivo e mandar dar boot por ele ele roda direto. Ele não depende de OS ou bootloader. Por exemplo usando o comando: dd if=memtest of=/dev/sda. Após fazer isso se eu reiniciar o PC e mandar da boot pelo disco rigido que é representado por sda no linux o memtest já sai rodando direto. Como faço pra compilar um codigo assembler pra rodar sem depender de OS?

David Teles da Silva disse...

eu só consegui compilar com: nasm -f wind32 exemplo.asm

Wise Informática disse...

na hora de criar o arquivo .o
usuarios de windows 10 64bits, escrevam assim no cmd

'nasm -f elf64 hello.asm.txt