En este tema, exploraremos los conceptos fundamentales de la CPU (Unidad Central de Procesamiento) y la memoria, que son esenciales para entender cómo funciona el lenguaje ensamblador. Este conocimiento te permitirá escribir programas más eficientes y comprender mejor cómo interactúan el hardware y el software.

  1. ¿Qué es la CPU?

La CPU es el cerebro del ordenador. Es responsable de ejecutar instrucciones y procesar datos. A continuación, se desglosan sus componentes principales:

Componentes de la CPU

  • Unidad de Control (CU): Dirige el flujo de datos entre la CPU y otros componentes del ordenador.
  • Unidad Aritmético-Lógica (ALU): Realiza operaciones aritméticas y lógicas.
  • Registros: Pequeñas áreas de almacenamiento dentro de la CPU que contienen datos temporales y direcciones.

Ciclo de Instrucción

El ciclo de instrucción de la CPU consta de tres etapas principales:

  1. Fetch (Búsqueda): La CPU obtiene una instrucción de la memoria.
  2. Decode (Decodificación): La CPU interpreta la instrucción.
  3. Execute (Ejecución): La CPU ejecuta la instrucción.

  1. ¿Qué es la Memoria?

La memoria es donde se almacenan los datos y las instrucciones que la CPU necesita para ejecutar programas. Existen varios tipos de memoria, cada uno con sus propias características y usos.

Tipos de Memoria

  • Memoria RAM (Random Access Memory): Memoria volátil que se utiliza para almacenar datos temporales y programas en ejecución.
  • Memoria ROM (Read-Only Memory): Memoria no volátil que contiene datos permanentes, como el firmware del sistema.
  • Caché: Memoria de alta velocidad que almacena copias de datos de la memoria principal para acelerar el acceso.

Jerarquía de Memoria

La jerarquía de memoria se organiza en niveles según la velocidad y el tamaño:

Nivel Tipo de Memoria Velocidad Tamaño
Nivel 1 Caché L1 Muy alta Muy pequeño
Nivel 2 Caché L2 Alta Pequeño
Nivel 3 RAM Media Grande
Nivel 4 Almacenamiento Baja Muy grande

  1. Interacción entre la CPU y la Memoria

La CPU y la memoria trabajan juntas para ejecutar programas. Aquí se explica cómo interactúan:

Bus de Datos y Direcciones

  • Bus de Datos: Transporta datos entre la CPU y la memoria.
  • Bus de Direcciones: Transporta direcciones de memoria desde la CPU a la memoria.

Ciclo de Lectura y Escritura

  1. Lectura: La CPU envía una dirección de memoria a través del bus de direcciones y recibe los datos correspondientes a través del bus de datos.
  2. Escritura: La CPU envía una dirección de memoria y los datos a escribir a través de los buses de direcciones y datos, respectivamente.

  1. Ejemplo Práctico: Acceso a la Memoria en Ensamblador

A continuación, se muestra un ejemplo simple de cómo acceder a la memoria en ensamblador x86:

section .data
    myVar db 10  ; Define una variable de un byte con valor 10

section .text
    global _start

_start:
    mov eax, [myVar]  ; Cargar el valor de myVar en el registro EAX
    add eax, 5        ; Sumar 5 al valor en EAX
    mov [myVar], eax  ; Guardar el nuevo valor de EAX en myVar

    ; 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. Definición de Datos:

    section .data
        myVar db 10  ; Define una variable de un byte con valor 10
    
    • section .data: Sección de datos donde se definen las variables.
    • myVar db 10: Define una variable myVar de un byte con el valor 10.
  2. Acceso a la Memoria:

    mov eax, [myVar]  ; Cargar el valor de myVar en el registro EAX
    add eax, 5        ; Sumar 5 al valor en EAX
    mov [myVar], eax  ; Guardar el nuevo valor de EAX en myVar
    
    • mov eax, [myVar]: Carga el valor de myVar en el registro EAX.
    • add eax, 5: Suma 5 al valor en EAX.
    • mov [myVar], eax: Guarda el nuevo valor de EAX en myVar.
  3. Salida del Programa:

    mov eax, 1        ; Código de salida del sistema
    int 0x80          ; Llamada al sistema para salir
    
    • mov eax, 1: Coloca el código de salida del sistema en EAX.
    • int 0x80: Realiza una llamada al sistema para salir del programa.

  1. Ejercicio Práctico

Ejercicio

Escribe un programa en ensamblador que realice las siguientes operaciones:

  1. Define una variable num con el valor 20.
  2. Carga el valor de num en un registro.
  3. Multiplica el valor por 2.
  4. Guarda el nuevo valor en num.

Solución

section .data
    num db 20  ; Define una variable de un byte con valor 20

section .text
    global _start

_start:
    mov eax, [num]  ; Cargar el valor de num en el registro EAX
    shl eax, 1      ; Multiplicar el valor en EAX por 2 (desplazamiento a la izquierda)
    mov [num], eax  ; Guardar el nuevo valor de EAX en num

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

Explicación del Código

  • shl eax, 1: Desplaza los bits de EAX a la izquierda una posición, lo que equivale a multiplicar por 2.

Conclusión

En esta lección, hemos cubierto los conceptos básicos de la CPU y la memoria, su interacción y cómo acceder a la memoria en ensamblador. Estos fundamentos son cruciales para escribir programas eficientes y comprender el funcionamiento interno de un ordenador. En la próxima lección, profundizaremos en los registros y sus funciones.

© Copyright 2024. Todos los derechos reservados