Introducción

El lenguaje ensamblador x86 es uno de los más utilizados debido a la popularidad de la arquitectura x86 en computadoras personales y servidores. En este módulo, aprenderás los conceptos fundamentales del ensamblador x86, cómo escribir y ejecutar programas simples, y cómo utilizar las instrucciones y registros específicos de esta arquitectura.

Contenido

Arquitectura x86

La arquitectura x86 es una familia de arquitecturas de conjunto de instrucciones (ISA) desarrollada por Intel. Es conocida por su compatibilidad hacia atrás, lo que significa que los programas escritos para versiones anteriores de la arquitectura pueden ejecutarse en versiones más nuevas.

Características Clave

  • Compatibilidad hacia atrás: Permite ejecutar programas antiguos en hardware nuevo.
  • Conjunto de instrucciones complejo (CISC): Ofrece una amplia variedad de instrucciones, lo que facilita ciertas tareas a costa de una mayor complejidad en el diseño del hardware.
  • Modos de operación: Incluye modos como el modo real y el modo protegido, que determinan cómo se accede a la memoria y se ejecutan las instrucciones.

Registros en x86

Los registros son pequeñas áreas de almacenamiento dentro de la CPU que se utilizan para realizar operaciones rápidas. En la arquitectura x86, los registros se dividen en varias categorías:

Registros de Propósito General

Registro Descripción
EAX Acumulador para operaciones aritméticas y de E/S
EBX Base para direcciones de datos en memoria
ECX Contador para operaciones de bucle y desplazamiento
EDX Extensión del acumulador para operaciones aritméticas y de E/S

Registros de Segmento

Registro Descripción
CS Segmento de código
DS Segmento de datos
SS Segmento de pila
ES, FS, GS Segmentos adicionales para datos

Registros de Puntero e Índice

Registro Descripción
ESI Fuente para operaciones de cadena
EDI Destino para operaciones de cadena
EBP Puntero base para la pila
ESP Puntero de pila

Instrucciones Básicas

Las instrucciones en ensamblador x86 se dividen en varias categorías, incluyendo aritméticas, lógicas, de control de flujo, y de manipulación de datos.

Instrucciones Aritméticas

  • ADD - Suma dos operandos.
  • SUB - Resta el segundo operando del primero.
  • MUL - Multiplica dos operandos.
  • DIV - Divide el primer operando por el segundo.

Instrucciones Lógicas

  • AND - Realiza una operación AND bit a bit.
  • OR - Realiza una operación OR bit a bit.
  • XOR - Realiza una operación XOR bit a bit.
  • NOT - Invierte los bits del operando.

Instrucciones de Control de Flujo

  • JMP - Salta a una dirección específica.
  • JE - Salta si los operandos son iguales.
  • JNE - Salta si los operandos no son iguales.
  • CALL - Llama a una subrutina.
  • RET - Retorna de una subrutina.

Modo Real vs. Modo Protegido

Modo Real

  • Acceso directo a la memoria: Permite acceso directo a todos los segmentos de memoria.
  • Limitaciones: Solo puede acceder a 1 MB de memoria y no ofrece protección de memoria.

Modo Protegido

  • Protección de memoria: Evita que los programas accedan a áreas de memoria no autorizadas.
  • Acceso a más memoria: Puede acceder a más de 1 MB de memoria.
  • Multitarea: Soporta la ejecución de múltiples tareas simultáneamente.

Escribiendo y Ejecutando un Programa en x86

Ejemplo de Programa Simple

A continuación, se muestra un ejemplo de un programa en ensamblador x86 que suma dos números y almacena el resultado en un registro.

section .data
    num1 db 5
    num2 db 10
    result db 0

section .text
    global _start

_start:
    mov al, [num1]    ; Cargar num1 en el registro AL
    add al, [num2]    ; Sumar num2 al valor en AL
    mov [result], al  ; Almacenar el resultado en 'result'

    ; Salir del programa
    mov eax, 1        ; Código de salida del sistema
    int 0x80          ; Llamada al sistema para salir

Explicación del Código

  1. Sección de Datos: Define las variables num1, num2 y result.
  2. Sección de Texto: Contiene el código ejecutable.
  3. Instrucciones:
    • mov al, [num1]: Carga el valor de num1 en el registro AL.
    • add al, [num2]: Suma el valor de num2 al registro AL.
    • mov [result], al: Almacena el resultado en la variable result.
    • mov eax, 1 y int 0x80: Llama al sistema para salir del programa.

Compilación y Ejecución

Para compilar y ejecutar el programa, puedes usar el ensamblador NASM y el enlazador LD en un entorno Linux.

nasm -f elf32 -o program.o program.asm
ld -m elf_i386 -o program program.o
./program

Ejercicios Prácticos

Ejercicio 1: Suma de Tres Números

Escribe un programa en ensamblador x86 que sume tres números y almacene el resultado en una variable.

Ejercicio 2: Comparación de Números

Escribe un programa que compare dos números y almacene el mayor en una variable.

Ejercicio 3: Bucle de Suma

Escribe un programa que sume los números del 1 al 10 utilizando un bucle.

Soluciones

Ejercicio 1: Suma de Tres Números

section .data
    num1 db 5
    num2 db 10
    num3 db 15
    result db 0

section .text
    global _start

_start:
    mov al, [num1]
    add al, [num2]
    add al, [num3]
    mov [result], al

    mov eax, 1
    int 0x80

Ejercicio 2: Comparación de Números

section .data
    num1 db 5
    num2 db 10
    max db 0

section .text
    global _start

_start:
    mov al, [num1]
    cmp al, [num2]
    jg num1_is_greater
    mov al, [num2]
    jmp store_max

num1_is_greater:
    mov al, [num1]

store_max:
    mov [max], al

    mov eax, 1
    int 0x80

Ejercicio 3: Bucle de Suma

section .data
    sum db 0

section .text
    global _start

_start:
    mov ecx, 10
    xor al, al

sum_loop:
    add al, cl
    loop sum_loop

    mov [sum], al

    mov eax, 1
    int 0x80

Conclusión

En este módulo, has aprendido los conceptos fundamentales del lenguaje ensamblador x86, incluyendo la arquitectura, los registros, las instrucciones básicas, y cómo escribir y ejecutar programas simples. Estos conocimientos te preparan para explorar temas más avanzados y aplicar el ensamblador x86 en proyectos prácticos. En el próximo módulo, profundizaremos en otras arquitecturas de ensamblador, como ARM, MIPS y RISC-V.

© Copyright 2024. Todos los derechos reservados