Introducción
El lenguaje ensamblador (assembler) es un lenguaje de bajo nivel que permite escribir programas directamente para el hardware de la máquina. En este artículo, te guiaremos a través de los primeros pasos para programar en assembler x86_64 en Ubuntu, abarcando desde la instalación de herramientas necesarias hasta la creación y ejecución de tu primer programa en assembler.
Instalación de las Herramientas Necesarias
Para comenzar a programar en assembler, necesitamos instalar algunas herramientas esenciales: un editor de texto, el ensamblador NASM (Netwide Assembler) y el enlazador LD.
Instalación de NASM
NASM es un ensamblador popular y ampliamente utilizado en el mundo Linux.
- Actualizar los Repositorios:
sudo apt update
- Instalar NASM:
sudo apt install nasm
Instalación de LD (GNU Linker)
LD es el enlazador que utilizaremos para convertir los archivos objeto generados por NASM en ejecutables.
- Instalar Binutils (que incluye LD):
sudo apt install binutils
Escribiendo tu Primer Programa en Assembler
Ahora que tenemos nuestras herramientas instaladas, podemos escribir nuestro primer programa en assembler. Vamos a crear un sencillo programa que imprime «Hola, Mundo» en la terminal.
Paso 1: Crear el Archivo Fuente en Assembler
- Abrir tu editor de texto favorito (por ejemplo, Nano, Vim, o cualquier otro):
nano hola.asm
- Escribir el código en assembler:
section .data
hello db 'Hola, Mundo', 0
section .text
global _start
_start:
; Llamada al sistema write (sys_write)
mov rax, 1 ; Número de llamada al sistema para sys_write
mov rdi, 1 ; File descriptor (1 = stdout)
mov rsi, hello ; Dirección del mensaje a escribir
mov rdx, 12 ; Número de bytes a escribir
syscall ; Llamada al sistema
; Llamada al sistema exit (sys_exit)
mov rax, 60 ; Número de llamada al sistema para sys_exit
xor rdi, rdi ; Código de salida 0
syscall ; Llamada al sistema
Paso 2: Compilar el Código Fuente
Una vez que hemos escrito nuestro código en assembler, necesitamos ensamblarlo utilizando NASM.
- Ensamblar el archivo fuente:
nasm -f elf64 -o hola.o hola.asm
Paso 3: Enlazar el Archivo Objeto
El siguiente paso es enlazar el archivo objeto para crear un ejecutable.
- Enlazar el archivo objeto:
ld -o hola hola.o
Paso 4: Ejecutar el Programa
Ahora que tenemos nuestro ejecutable, podemos ejecutarlo para ver el resultado.
- Ejecutar el programa:
./hola
Deberías ver «Hola, Mundo» impreso en la terminal.
Comprensión del Código
Vamos a desglosar el código que escribimos para entender mejor cómo funciona:
- section .data: Esta sección contiene los datos estáticos que el programa utilizará. Aquí, definimos el mensaje «Hola, Mundo».
- section .text: Esta sección contiene el código ejecutable.
- global _start: Define el punto de entrada del programa.
- _start: Es la etiqueta que marca el inicio del programa.
- mov rax, 1: Coloca el número de llamada al sistema para sys_write en el registro RAX.
- mov rdi, 1: Especifica el file descriptor 1, que es stdout.
- mov rsi, hello: Carga la dirección del mensaje en el registro RSI.
- mov rdx, 12: Especifica que se van a escribir 12 bytes (la longitud de «Hola, Mundo»).
- syscall: Llama al kernel para ejecutar la llamada al sistema.
- mov rax, 60: Coloca el número de llamada al sistema para sys_exit en el registro RAX.
- xor rdi, rdi: Pone el código de salida en 0.
- syscall: Llama al kernel para salir del programa.
Conclusión
Hemos cubierto los primeros pasos para programar en assembler x86_64 en Ubuntu, incluyendo la instalación de las herramientas necesarias, la escritura y compilación de un programa simple. Aunque assembler puede parecer intimidante al principio, con práctica y paciencia puedes aprender a escribir programas eficientes y entender más profundamente el funcionamiento interno de las computadoras.