Compilar un programa ensamblador con Nasm

Diciembre 2016




Nasm es un ensamblador libre para la arquitectura x86. Podemos encontrarlo para diversos sistemas operativos como Linux o Windows.
Un ensamblador permite ensamblar código en lenguaje ensamblador. (sic)

Desgraciadamente, ensamblador significa dos cosas:
  • el lenguaje ensamblador que permite programar en lenguaje de maquina utilizando instrucciones mnemónicas
  • el programa que va a transformar tu código en lenguaje de maquina para que pueda ser comprendido directamente por el procesador.


Este tutorial no te enseñará a programar con Nasm, sino a crear un ejecutable bajo Linux y Windows a partir de un código fuente destinado a Nasm.

En Linux


Etapa 1. Crear un fichero fuente


No es necesario un editor específico para crear un fichero fuente destinado a Nasm. Eventualmente podríamos utilizar un editor que soporte la coloración sintáctica del ensamblador pero que yo sepa no existe uno que soporte la sintaxis de Nasm.
Por lo tanto, podemos elegir entre gedit, kwrite, xemacs etc...

Cuando guardes el fichero fuente, ponle la extensión .asm

Etapa 2. Ensamblar el fichero fuente


Para esta etapa, necesitaremos que el programa Nasm esté instalado en nuestra maquina. Si estás bajo Debian o Ubuntu, simplemente escribe el comando:
sudo apt-get install nasm


Si utilizas otra distribución Linux, deberás utilizar el gestor de paquetes de tu distribución (por ejemplo urpmi, yum, emerge etc...)o compilar nasm descargando el fichero desde el sitio oficial.

Pasemos ahora al ensamblado del fichero fuente.
Dirígete en línea de comandos a la carpeta donde se encuentra el fichero fuente al que llamaremos por ejemplo test.asm. La línea a escribir es:
nasm -f elf test.asm


Esto creará un fichero llamado test.o en el directorio actual. Este fichero aun no es ejecutable, únicamente es un fichero objeto, es decir un fichero que es necesario leer con las bibliotecas de las que depende como por ejemplo la biblioteca standard libc.

Etapa 3. Creación del ejecutable


Ahora que ya tenemos nuestro fichero objeto llamado test.o vamos a crear nuestro ejecutable.
Aquí se presentan dos casos:
  • El programa inicia con un procedimiento llamado “_start”. Esto significa que el programa posee su propio punto de entrada sin utilizar la función main. Esto no cambia mucho, sin embargo necesitarás utilizar el comando "ld" para crear el ejecutable:
    ld test.o -o test
  • El programa inicia con un procedimiento llamado “main”. Entonces necesitaras utilizar gcc para crear el ejecutable:
    gcc test.o -o test


Y listo el ejecutable ha sido creado, se llama test y se ubica en el directorio actual.

Etapa 4. Ejecución del programa


Para ejecutar nuestro programa llamado “test”, basta con escribir este comando:
./test


También podemos utilizar un depurador para observar la ejecución. Para ello podemos utilizar gdb que se utiliza en línea de comandos. Si deseas un depurador más visual, existen interfaces graficas que utilizan gdb en segundo plano como por ejemplo Insight.

En Windows


IMPORTANTE: Bajo Windows la convención de llamado de parámetros no es la misma, la función llamada debe limpiar ella misma la pila. Igualmente, main no existe bajo Windows, debe ser remplazado por WinMain.
Si tu punto de entrada es _start o main, deberás cambiarlo a "_WinMain@16" y cambiar “ret” al final de este procedimiento de entrada a "ret 16".
Ejemplo de un fichero fuente correcto bajo Windows:
section .text
	global _WinMain@16

_WinMain@16:
	mov eax, 0
	ret 16

Etapa 1. Instalar los programas necesarios


Primero vamos a instalar nasm. Nos dirigimos a la sección de descargas de Kioskea o a las sección download del sitio oficial (seleccionamos la versión Win32 binario). Guardamos el archivo que luego lo utilizaremos.

La etapa más delicada será la de instalar MingW, un entorno de desarrollo libre para Windows.
En esta dirección, seleccionamos la última versión de MinGW. Actualmente es la versión 5.0.0. Ejecutamos este instalador. Si nos ofrece actualizar el instalador desde el inicio, decimos que no. Dejamos todas las opciones seleccionadas por defecto luego esperamos el final de la instalación.

Ahora, vamos a insertar nasm en el entorno de desarrollo MingW.
Descomprime el fichero nasm, deberías obtener una carpeta conteniendo, entre otros, un fichero llamado nasm.exe
Copia este fichero en la carpeta C:\MinGW\bin

Etapa 2. Crear un fichero fuente


Al igual que en Linux, no es necesario utilizar un editor especifico para crear un fichero fuente destinado a nasm.
Podemos utilizar por ejemplo el bloc de notas, pero debemos tener cuidado ya que el bloc de notas de Windows tiene tendencia a agregar la extensión .txt a los ficheros que crea. Para estar seguros, lo que recomiendo es mostrar las extensiones de los ficheros.
En todo caso debemos evitar utilizar procesadores de texto como Word o WordPad que pueden guardar el fichero en un formado no deseado.

Si lo utilizas, también puedes utilizar un editor que utiliza la coloración sintáctica para la sintaxis de nasm como NasmEdit IDE (gratuito).

En todos los casos recomiendo poner la extensión .asm a los ficheros.


Etapa 3. Ensamblar el fichero fuente


Abre el interprete de comandos de Windows (escribe cmd.exe en “Ejecutar” del menú Inicio o directamente “cmd” en la barra de búsqueda del logo de Windows bajo Windows Vista).
En el intérprete de comandos debes ir a la carpeta que contiene tu fichero fuente utilizando el comando “cd”.
Una vez que estés en esa carpeta, ensambla tu fichero fuente (llamémoslo test.asm) con este comando:
nasm -f win32 test.asm -o test.o


Ahora tienes un fichero objeto que aun no es ejecutable, pero lo será pronto, pasemos a la última etapa.

Etapa 4. Creación y ejecución del programa


Siempre en la ventana DOS, escribe un ultimo comando para crear el ejecutable:
ld test.o -o test.exe


Si tienes algún problema con este comando, quizás sea porque has olvidado leer el punto que escribí al inicio de la sección “Para Windows”.
Para testear el ejecutable, simplemente escribe “test” en la ventana DOS. Si deseas un depurador para visualizar de más cerca lo que pasa, utiliza OllyDbg, es un excelente depurador.

PD: El artículo original fue escrito por kilian, contribuidor de CommentCaMarche

Consulta también :
El documento «Compilar un programa ensamblador con Nasm» de CCM (es.ccm.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo siempre y cuando respetes las condiciones de dicha licencia y des crédito a CCM.