En esta sección, aprenderás a escribir tu primer programa en ensamblador. Cubriremos los conceptos básicos necesarios para entender cómo funciona un programa en ensamblador y te guiaremos paso a paso a través del proceso de escribir, ensamblar y ejecutar tu primer programa.

Objetivos

  • Comprender la estructura básica de un programa en ensamblador.
  • Escribir un programa simple que imprima un mensaje en la pantalla.
  • Ensamblar y ejecutar el programa utilizando un ensamblador y un emulador.

Estructura Básica de un Programa en Ensamblador

Un programa en ensamblador generalmente consta de las siguientes secciones:

  1. Sección de Datos: Aquí se definen las variables y constantes que el programa utilizará.
  2. Sección de Código: Contiene las instrucciones que la CPU ejecutará.

Ejemplo de Estructura Básica

section .data
    ; Aquí se definen los datos

section .bss
    ; Aquí se definen las variables no inicializadas

section .text
    global _start

_start:
    ; Aquí comienza el código del programa

Escribiendo un Programa Simple

Vamos a escribir un programa que imprima "Hola, Mundo" en la pantalla. Para ello, utilizaremos las llamadas al sistema de Linux.

Sección de Datos

En esta sección, definimos el mensaje que queremos imprimir.

section .data
    msg db 'Hola, Mundo', 0xA  ; El mensaje a imprimir seguido de un salto de línea
    len equ $ - msg            ; La longitud del mensaje

Sección de Código

En esta sección, escribimos las instrucciones que la CPU ejecutará.

section .text
    global _start

_start:
    ; Llamada al sistema write (sys_write)
    mov eax, 4          ; Número de la llamada al sistema (sys_write)
    mov ebx, 1          ; File descriptor (1 = stdout)
    mov ecx, msg        ; Dirección del mensaje
    mov edx, len        ; Longitud del mensaje
    int 0x80            ; Interrupción para llamar al kernel

    ; Llamada al sistema exit (sys_exit)
    mov eax, 1          ; Número de la llamada al sistema (sys_exit)
    xor ebx, ebx        ; Código de salida (0)
    int 0x80            ; Interrupción para llamar al kernel

Explicación del Código

  1. Sección de Datos:

    • msg db 'Hola, Mundo', 0xA: Define el mensaje "Hola, Mundo" seguido de un salto de línea (0xA en hexadecimal).
    • len equ $ - msg: Calcula la longitud del mensaje.
  2. Sección de Código:

    • mov eax, 4: Coloca el número de la llamada al sistema sys_write en el registro eax.
    • mov ebx, 1: Coloca el file descriptor 1 (stdout) en el registro ebx.
    • mov ecx, msg: Coloca la dirección del mensaje en el registro ecx.
    • mov edx, len: Coloca la longitud del mensaje en el registro edx.
    • int 0x80: Llama al kernel para ejecutar la llamada al sistema sys_write.
    • mov eax, 1: Coloca el número de la llamada al sistema sys_exit en el registro eax.
    • xor ebx, ebx: Coloca 0 en el registro ebx (código de salida).
    • int 0x80: Llama al kernel para ejecutar la llamada al sistema sys_exit.

Ensamblar y Ejecutar el Programa

Paso 1: Escribir el Código en un Archivo

Guarda el código en un archivo llamado hola_mundo.asm.

Paso 2: Ensamblar el Código

Utiliza el ensamblador nasm para ensamblar el código:

nasm -f elf32 hola_mundo.asm -o hola_mundo.o

Paso 3: Vincular el Código

Utiliza el enlazador ld para crear el ejecutable:

ld -m elf_i386 hola_mundo.o -o hola_mundo

Paso 4: Ejecutar el Programa

Ejecuta el programa:

./hola_mundo

Deberías ver el mensaje "Hola, Mundo" impreso en la pantalla.

Ejercicio Práctico

Ejercicio 1

Modifica el programa para que imprima tu nombre en lugar de "Hola, Mundo".

Solución

section .data
    msg db 'Tu Nombre', 0xA  ; El mensaje a imprimir seguido de un salto de línea
    len equ $ - msg          ; La longitud del mensaje

section .text
    global _start

_start:
    ; Llamada al sistema write (sys_write)
    mov eax, 4          ; Número de la llamada al sistema (sys_write)
    mov ebx, 1          ; File descriptor (1 = stdout)
    mov ecx, msg        ; Dirección del mensaje
    mov edx, len        ; Longitud del mensaje
    int 0x80            ; Interrupción para llamar al kernel

    ; Llamada al sistema exit (sys_exit)
    mov eax, 1          ; Número de la llamada al sistema (sys_exit)
    xor ebx, ebx        ; Código de salida (0)
    int 0x80            ; Interrupción para llamar al kernel

Conclusión

En esta lección, has aprendido a escribir, ensamblar y ejecutar un programa simple en ensamblador. Ahora tienes una comprensión básica de la estructura de un programa en ensamblador y cómo interactuar con el sistema operativo mediante llamadas al sistema. En las próximas lecciones, profundizaremos en más detalles y conceptos avanzados del lenguaje ensamblador.

© Copyright 2024. Todos los derechos reservados