Este artículo proporciona un tutorial práctico para establecer un entorno de compilación y depuración utilizendo nasm y gdb en sistemas Linux. El siguiente ejemplo demeustra los pasos esenciales para compilar y depurar código ensamblador.
Consideremos el siguiente programa como ejemplo de implementación:
section .data
mensaje db "hola desde ensamblador", 10 ; Cadena a imprimir en pantalla
tamano equ $ - mensaje ; Calcula la longitud de la cadena
section .text
global _main ; Punto de entrada reconocido por el enlazador
; Rutina de finalización del programa
finalizar:
mov rax, 60 ; Código de sistema para exit
mov rdi, 0 ; Código de salida
syscall ; Invocación al sistema
; Función de suma simple
; Parámetros: rsi, rdi
suma:
push rbp
mov rbp, rsp
mov [rbp-8], rsi
mov [rbp-16], rdi
mov eax, [rbp-8]
add eax, [rbp-16]
pop rbp
ret
; Punto de entrada principal
_main:
; Llamada al sistema write para mostrar texto
mov rax, 1 ; Código para write
mov rdi, 1 ; Salida estándar
mov rsi, mensaje ; Dirección del texto
mov rdx, tamano ; Longitud del texto
syscall ; Ejecutar llamada al sistema
mov rsi, 15
mov rdi, 25
call suma
mov rbx, rax
jmp finalizar
Proceso de Compilación con NASM
En entornos Linux, nasm permite generar archivos ejecutables mediante dos métodos principales:
- Generar código objeto y luego enlazar:
nasm -f elf64 programa.asm -o programa.o
ld -o programa programa.o
- Creación directa del ejecutbale:
nasm -f bin programa.asm -o programa
Depuración con GDB
El código generado por NASM no contiene información de depuración, por lo que debemos utilizar instrucciones como disassemble para examinar el código:
gdb ./programa # Iniciar gdb
# Comandos en la interfaz interactiva
break _main # Establecer punto de ruptura en _main
run # Ejecutar el programa
layout asm # Vista TUI con código ensamblador
layout regs # Vista TUI con registros del procesador
Comandos Comunes de GDB:
info registers: Muestra información de todos los registrosstepi: Ejecuta una sola instruccióncontinue: Continúa la ejecución del programabreak *0x401016: Establece punto de ruptura en dirección específicax /10x $rsp - 16: Examina 10 palabras de memoria a partir de rsp-16
Es importante considerar la arquitectura (64 bits = 8 bytes por registro) y el formato de endianidad little empleado por los procesadores Intel.