Compilar um programa de linguagem de montagem com o Nasm

Junho 2017



Nasm é um software Assembly (linguagem de montagem) livre, para arquitetura x86. É possível encontrá-lo para vários Sistemas Operacionais como o Linux ou o Windows, por exemplo.
Um montador permite montar o código Assembly. (sic)

Infelizmente, Assembly significa duas coisas
  • A linguagem "Assembly", que permite programar em linguagem de máquina usando mnemônicos
  • O software que converterá o seu código em linguagem de máquina compreensível pelo seu processador.


Esta dica não te ensinará a programar com o Nasm, mas a criar um executável para o Linux e o Windows a partir de um código-fonte para o Nasm.

Para o Linux

Etapa n° 1. Criar um arquivo fonte


Você não precisa de um editor específico para criar um arquivo fonte para o NASM. Você poderia usar um editor que suporte a sintaxe do montador, mas não há, a meu conhecimento, quem suporte a sintaxe do Nasm.

Então, você pode escolher o gedit, kwrite, xemacs, etc...

Ao salvar o seu arquivo fonte, dê-lhe a extensão .asm

Etapa n° 2. Montar o arquivo fonte


Para esta etapa, você precisará de um software Nasm instalado em sua máquina. Se você roda no Debian ou Ubuntu, basta digitar o comando
sudo apt-get install nasm



Se você tiver outra distribuição Linux, você deverá usar o gerenciador de pacotes da sua distribuição (por exemplo, urpmi, yum, emerge, etc) ou compilar o Nasm baixando o arquivo a partir do site oficial.


Passemos à montagem do seu arquivo fonte.
Vá para a linha de comando no diretório onde fica o arquivo fonte que chamaremos "test.asm", por exemplo. Veja a linha a ser digitada:
nasm -f elf test.asm


Isso criará um arquivo chamado "test.o" no diretório atual. Esse arquivo ainda não é executável, ele ainda é apenas um arquivo de objeto, ou seja, um arquivo que deve ser conectado com as bibliotecas das quais ele depende, como por exemplo, a biblioteca padrão "libc".

Etapa n° 3. Criação do executável


Agora que já temos o nosso arquivo de objeto chamado "test.o", vamos criar o nosso executável.

Dois casos se apresentam aqui:
  • Seu programa começa com um procedimento chamado "_start". Isso significa que seu programa tem seu próprio ponto de entrada, sem usar a função "main" (principal). Isso não muda muita coisa, mas você precisará usar o comando "ld" para criar o executável:


ld test.o -o test
  • Seu programa começa com um procedimento chamado "main". Você precisará utilizar o gcc para criar o seu executável:

gcc test.o -o test

Pronto, nosso executável foi criado, ele se chama "test" e se situa no diretório atual.

Etapa n° 4. Execução do programa


Para executar nosso programa chamado "test", basta digitar este comando:
./test

Você também pode usar um depurador para assistir à execução. Para fazê-lo, você pode utilizar o gdb, que é usado em linha de comando. Se, no entanto, você quiser um depurador mais visual, existem interfaces gráficas que utilizam o gdb em plano de fundo, como o "Insight".

Para o Windows


IMPORTANTE: No Windows, a convenção de chamada de configuração não é a mesma, a função chamada deve limpar, ela mesma, a pilha. Da mesma forma, o "mains" não existe no Windows, ele deve ser substituído pelo WinMain.
Se o seu ponto de entrada for "_start" ou "main", é preciso trocar para "_WinMain@16" e mudar o "ret" no final, deste procedimento de entrada, para "ret 16".

Exemplo de um arquivo fonte correto no Windows:
section .text 
 global _WinMain@16 

_WinMain@16: 
 mov eax, 0 
 ret 16 

Etapa n° 1. Instalar os softwares necessários


Vamos primeiro instalar o Nasm. Vá na seção de download do Kioskea ou no site oficial, na seção de downloads (selecione a versão Win32 binários). Mantenha o seu arquivo em um canto, ele será usado mais tarde.

A etapa mais delicada vai ser a de instalar "MingW", que é um ambiente de desenvolvimento grátis para o Windows.
Neste endereço, escolha a última versão do MinGW. Atualmente, é a versão 5.0.0.
Se ele te propor atualizar a sua instalação desde o início, diga não. Deixe todas as opções padrão selecionadas e, em seguida, espere o fim da instalação.
Agora, vamos inserir o Nasm no ambiente de desenvolvimento MingW, como selvagens, mas com delicadeza.
Descompacte o arquivo do Nasm, você deveria obter uma pasta com, entre outras coisas, um arquivo chamado "nasm.exe"

Copie este arquivo no diretório C:\MinGW\bin

Etapa n° 2. Criar um arquivo fonte


Como para o Linux, não é preciso usar um editor específico para criar um arquivo fonte para o NASM.
Você pode usar o bloco de notas por exemplo, mas cuidado, o bloco de notas do Windows tem uma tendência a acrescentar a extensão .txt aos arquivos que ele cria. Para evitar qualquer ambiguidade, recomendo exibir as extensões dos seus arquivos.
Evite, em todos os casos, processamentos de texto como o Word ou o WordPad, que podem salvar o seu arquivo com um formato inadequado.
Se quiser, utilize um editor que use a sintaxe Nasm como NasmEdit IDE (gratuito).
Em todo caso, sugiro que você dê a extensão .asm ao seu arquivo fonte.

Etapa n° 3. Montar o arquivo fonte


Abra o interpretador de comandos do Windows (digite cmd.exe em "Executar" do menu "Iniciar" ou, diretamente, "cmd" na barra de "busca" do logotipo do Windows no Vista.
Com este interpretador de comandos, você deverá ir para a pasta contendo o seu arquivo fonte com o comando "cd".
Assim que estiver nesse diretório, monte o seu arquivo fonte (vamos chamá-lo de "test.asm") com este comando:
nasm -f win32 test.asm -o test.o

Agora, você tem um arquivo de objeto que ainda não é executável, mas que o dera em breve. Passemos à última etapa.

Etapa n° 4. Criação e execução do programa


Ainda em sua janela de comando, digite um último comando passado para criar o executável:
ld test.o -o test.exe

Se você tiver um problema com esse comando, talvez você tenha esquecido de ler o ponto importante que citei acima, no início da seção "Para o Windows".

Para testar o seu executável, basta digitar "test" na janela de comando. Se você quiser um depurador para ver mais de perto o que está acontecendo, use o OllyDbg. É um excelente depurador.



Tradução feita por Lucia Maurity y Nouira

Veja também

Artigo original publicado por . Tradução feita por pintuda. Última modificação: 18 de março de 2011 às 14:02 por pintuda.
Este documento, intitulado 'Compilar um programa de linguagem de montagem com o Nasm', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.