Introducción

En este módulo, exploraremos las interrupciones y las llamadas al sistema, dos conceptos fundamentales en la programación en ensamblador que permiten interactuar con el hardware y el sistema operativo. Las interrupciones son señales que indican que un evento ha ocurrido, mientras que las llamadas al sistema son interfaces que permiten a los programas solicitar servicios del sistema operativo.

Conceptos Clave

Interrupciones

  • Definición: Una interrupción es una señal enviada al procesador que indica que un evento necesita atención inmediata.
  • Tipos de Interrupciones:
    • Interrupciones de Hardware: Generadas por dispositivos externos como teclados, ratones, etc.
    • Interrupciones de Software: Generadas por instrucciones específicas en el código del programa.
    • Interrupciones del Sistema: Generadas por el sistema operativo para manejar eventos internos.

Llamadas al Sistema

  • Definición: Una llamada al sistema es una interfaz que permite a un programa solicitar servicios del sistema operativo, como operaciones de entrada/salida, gestión de memoria, etc.
  • Ejemplos Comunes:
    • int 0x80 en sistemas Linux para realizar llamadas al sistema.
    • syscall en sistemas modernos de 64 bits.

Interrupciones en Detalle

Tabla de Interrupciones

La tabla de interrupciones es una estructura de datos que contiene las direcciones de las rutinas de servicio de interrupciones (ISR). Cada entrada en la tabla corresponde a una interrupción específica.

Interrupción Descripción
0x00 División por cero
0x80 Llamada al sistema en Linux
... ...

Manejo de Interrupciones

Cuando ocurre una interrupción, el procesador:

  1. Guarda el estado actual (registros, puntero de instrucción).
  2. Busca la dirección de la ISR en la tabla de interrupciones.
  3. Salta a la ISR y ejecuta el código correspondiente.
  4. Restaura el estado y continúa la ejecución normal.

Ejemplo de Interrupción de Software

section .data
    msg db 'Hello, World!', 0x0A  ; Mensaje a imprimir

section .text
    global _start

_start:
    ; Llamada al sistema para escribir en la salida estándar
    mov eax, 4          ; Número de llamada al sistema (sys_write)
    mov ebx, 1          ; File descriptor (1 = salida estándar)
    mov ecx, msg        ; Dirección del mensaje
    mov edx, 13         ; Longitud del mensaje
    int 0x80            ; Interrupción de software para llamada al sistema

    ; Llamada al sistema para salir del programa
    mov eax, 1          ; Número de llamada al sistema (sys_exit)
    xor ebx, ebx        ; Código de salida (0)
    int 0x80            ; Interrupción de software para llamada al sistema

Llamadas al Sistema en Detalle

Realizando una Llamada al Sistema

Para realizar una llamada al sistema en Linux, se utilizan registros específicos para pasar los parámetros y el número de la llamada al sistema.

Registro Propósito
eax Número de la llamada al sistema
ebx Primer parámetro
ecx Segundo parámetro
edx Tercer parámetro

Ejemplo de Llamada al Sistema

El siguiente ejemplo muestra cómo realizar una llamada al sistema para leer datos desde la entrada estándar.

section .bss
    buffer resb 128  ; Buffer para almacenar los datos leídos

section .text
    global _start

_start:
    ; Llamada al sistema para leer desde la entrada estándar
    mov eax, 3          ; Número de llamada al sistema (sys_read)
    mov ebx, 0          ; File descriptor (0 = entrada estándar)
    mov ecx, buffer     ; Dirección del buffer
    mov edx, 128        ; Tamaño del buffer
    int 0x80            ; Interrupción de software para llamada al sistema

    ; Llamada al sistema para escribir en la salida estándar
    mov eax, 4          ; Número de llamada al sistema (sys_write)
    mov ebx, 1          ; File descriptor (1 = salida estándar)
    mov ecx, buffer     ; Dirección del buffer
    mov edx, 128        ; Tamaño del buffer
    int 0x80            ; Interrupción de software para llamada al sistema

    ; Llamada al sistema para salir del programa
    mov eax, 1          ; Número de llamada al sistema (sys_exit)
    xor ebx, ebx        ; Código de salida (0)
    int 0x80            ; Interrupción de software para llamada al sistema

Ejercicios Prácticos

Ejercicio 1: Escribir un Mensaje en la Salida Estándar

Objetivo: Escribir un programa en ensamblador que imprima "Hola, Mundo!" en la salida estándar utilizando una llamada al sistema.

Solución:

section .data
    msg db 'Hola, Mundo!', 0x0A  ; Mensaje a imprimir

section .text
    global _start

_start:
    ; Llamada al sistema para escribir en la salida estándar
    mov eax, 4          ; Número de llamada al sistema (sys_write)
    mov ebx, 1          ; File descriptor (1 = salida estándar)
    mov ecx, msg        ; Dirección del mensaje
    mov edx, 13         ; Longitud del mensaje
    int 0x80            ; Interrupción de software para llamada al sistema

    ; Llamada al sistema para salir del programa
    mov eax, 1          ; Número de llamada al sistema (sys_exit)
    xor ebx, ebx        ; Código de salida (0)
    int 0x80            ; Interrupción de software para llamada al sistema

Ejercicio 2: Leer y Escribir Datos

Objetivo: Escribir un programa en ensamblador que lea una línea de texto desde la entrada estándar y la escriba en la salida estándar.

Solución:

section .bss
    buffer resb 128  ; Buffer para almacenar los datos leídos

section .text
    global _start

_start:
    ; Llamada al sistema para leer desde la entrada estándar
    mov eax, 3          ; Número de llamada al sistema (sys_read)
    mov ebx, 0          ; File descriptor (0 = entrada estándar)
    mov ecx, buffer     ; Dirección del buffer
    mov edx, 128        ; Tamaño del buffer
    int 0x80            ; Interrupción de software para llamada al sistema

    ; Llamada al sistema para escribir en la salida estándar
    mov eax, 4          ; Número de llamada al sistema (sys_write)
    mov ebx, 1          ; File descriptor (1 = salida estándar)
    mov ecx, buffer     ; Dirección del buffer
    mov edx, 128        ; Tamaño del buffer
    int 0x80            ; Interrupción de software para llamada al sistema

    ; Llamada al sistema para salir del programa
    mov eax, 1          ; Número de llamada al sistema (sys_exit)
    xor ebx, ebx        ; Código de salida (0)
    int 0x80            ; Interrupción de software para llamada al sistema

Conclusión

En este módulo, hemos aprendido sobre las interrupciones y las llamadas al sistema, dos mecanismos esenciales para interactuar con el hardware y el sistema operativo en programación en ensamblador. Hemos visto cómo manejar interrupciones y realizar llamadas al sistema con ejemplos prácticos y ejercicios. Estos conceptos son fundamentales para escribir programas eficientes y efectivos en ensamblador.

En el próximo módulo, exploraremos macros y ensamblado condicional, que nos permitirán escribir código más modular y reutilizable.

© Copyright 2024. Todos los derechos reservados