Compilar un programa ensamblador con Nasm

última actualización el 5 de octubre de 2009, 20:03 por Carlos-vialfa
Publicado por Carlos-vialfa



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
Mejores respuestas para « Compilar un programa ensamblador con Nasm » en :
Compilar un programa en C bajo Linux Ver El compilador de C bajo Linux es gcc.Viene instalado por defecto en varias distribuciones, pero bajo Debian (y los que derivan de él) necesita ser instalado (aptitude install gcc). gcc Sintaxis de GCC gcc Primero veamos lo que significa...
[Linux] Instalar programas (gestión de paquetes, compilación) Ver ************************************************************** * INSTALAR UN PROGRAMA BAJO LINUX: **** * LA GESTION DE PAQUETES o COMO SIMPLIFICARSE LA VIDA * * UN EJEMPLO DE COMPILACION PARA ENTRAR EN EL TEMA ...
La compilación y los módulos en C y C++ Ver El objetivo de este articulo es el de presentar los fundamentos de la compilación en C, C++ y de la programación modular. Esto nos permitirá comprender mejor los mensajes de error del compilador. Las nociones abordadas aquí son independientes del...
[Windows] Compilar de manera sencilla un proyecto Qt Ver[Windows] Compilar de manera sencilla un proyecto Qt Este truco te mostrará cómo compilar de una manera sencilla un proyecto Qt, utilizando un programa y un script batch. 1. La variable Path 1.1 Acceder a la variable Path 1.2 Modificar...
¿Qué lenguaje de programación aprender primero? Ver¿Qué lenguaje de programación aprender primero? Introducción Los lenguajes de programación que podemos utilizar Delphi/Pascal Java Python .Net Smalltalk Los que podemos utilizar en última instancia C/C++ PHP Ada Lisp/Caml/...
Ensamblador - Multiplicación por una constante VerEn lenguaje ensamblador podemos realizar una multiplicación utilizando las instrucciones mul (números sin signos) e imul. Su sintaxis es la siguiente: mul nombre_del_registro El procesador multiplica internamente el valor almacenado en eax o ax...
Descargar Dev-C++ VerLos entornos de programación son aplicaciones que contienen colecciones de funcionalidades que abarcan las diferentes facetas de la programación, diseñados para ayudar a los usuarios a desarrollar sus programas. Dev-C++ es un entorno de...
Lenguajes de programación VerLenguaje de programación Un lenguaje de programación" es un lenguaje diseñado para describir el conjunto de acciones consecutivas que un equipo debe ejecutar. Por lo tanto, un lenguaje de programación es un modo práctico para que los seres humanos...
Programa informático Ver¿Qué es un programa informático? Un programa informático es una serie de comandos ejecutados por el equipo. Sin embargo, el equipo sólo es capaz de procesar elementos binarios, es decir, una serie de 0s y 1s. Por lo tanto, necesitamos un lenguaje de...
Estructura de programa Ver¿Cómo funciona un programa informático? El comportamiento de un programa depende del tipo de lenguaje usado para escribirlo... En cualquier caso, casi todos los lenguajes de programación se basan en el mismo principio: el programa consiste en un...