5.4 Estructura y componentes de VonSim8

En esta sección se describe la estructura del simulador VonSim8. El diseño de los registros se concibió con un propósito pedagógico: facilitar la comprensión de los modos de direccionamiento y del ciclo de instrucción, elementos fundamentales en el estudio de la Arquitectura de Computadoras (Stallings 2021).

La Tabla 5.3 ofrece una descripción detallada de los componentes principales del simulador, especificando sus características y funcionalidades. Este panorama estructural permite identificar los elementos esenciales de la arquitectura implementada, facilitando la comprensión integral del diseño y su correspondencia con los objetivos pedagógicos del proyecto.

Tabla 5.3: Estructura VonSim8: componentes principales y características
Componente Características
Arquitectura Von Neumann: memoria compartida para datos e instrucciones.
Registros generales 4 registros de propósito general de 8 bits (AL, BL, CL, DL).
Registros específicos 6 registros de propósito específico:
  • IP (Instruction Pointer)
  • IR (Instruction Register)
  • SP (Stack Pointer)
  • Flags (registro de estado)
  • MAR (Memory Address Register)
  • MBR (Memory Buffer Register)
Acceso a registros Los registros de propósito general pueden ser accedidos y modificados por el programador. Los específicos son gestionados por la CPU.
Memoria Memoria principal de 256 bytes, direccionada por un bus de direcciones de 8 bits. Cada posición almacena un byte. La memoria se organiza en celdas de 16 bytes, con dirección inicial 0x00h y final 0xFFh.
Puertos Puertos de la CPU:
  • Bus de direcciones de 8 bits, gestionado por el buffer MAR.
  • Bus de datos de 8 bits, gestionado por el buffer MBR.
  • Señal de lectura (rd) y escritura (wr), cada una de 1 bit.
  • Señal IO/M (1 bit) para distinguir acceso a memoria o E/S.
  • Señal de petición de interrupción (INTR, 1 bit).
  • Señal de reconocimiento de interrupción (INTA, 1 bit).

En la arquitectura implementada por el simulador VonSim8, los registros constituyen componentes fundamentales de la CPU, ya que permiten almacenar y manipular datos de manera eficiente durante la ejecución de instrucciones. Los registros se clasifican, según su función y accesibilidad, en registros de propósito general y registros de propósito específico.

Los registros de propósito general son aquellos que el programador puede utilizar libremente para operaciones aritméticas, lógicas y de transferencia de datos. En el simulador, se dispone de cuatro registros de propósito general de 8 bits: AL, BL, CL y DL. Estos registros pueden emplearse como operandos en las instrucciones del repertorio.

Entre los registros de propósito específico, que no son accesibles directamente por el programador, se distinguen los siguientes:

  • SP (Stack Pointer): Gestiona la pila, permitiendo rastrear las direcciones de memoria involucradas en las operaciones de apilamiento y desapilamiento.
  • Flags (Flags Register): Almacena las banderas de estado, que reflejan los resultados de las operaciones aritméticas y lógicas, y permiten controlar el flujo de ejecución del programa.
  • IP (Instruction Pointer): Guarda la dirección de memoria de la próxima instrucción a ejecutar, garantizando la correcta secuenciación del programa.
  • IR (Instruction Register): Contiene el byte correspondiente a la instrucción que está siendo decodificada y ejecutada en ese instante.

Asimismo, existen dos registros fundamentales para la transferencia de datos entre la CPU y la memoria principal:

  • MAR (Memory Address Register): Almacena las direcciones de memoria a las que se desea acceder.
  • MBR (Memory Buffer Register): Retiene temporalmente el byte de datos que se transfiere entre la memoria principal y la CPU a través del bus de datos.

Finalmente, se incorporan dos registros auxiliares: ri, utilizado para el almacenamiento temporal de direcciones, e id, destinado al almacenamiento temporal de datos. Ambos cumplen funciones de apoyo durante la ejecución de instrucciones, optimizando la gestión interna de la CPU.

5.4.1 Unidad de Control

La unidad de control es responsable de coordinar todas las operaciones de la CPU. Se encarga de:

  • Decodificación de instrucciones: Interpreta el código de operación de cada instrucción.
  • Generación de señales de control: Activa las señales necesarias para ejecutar microoperaciones.
  • Secuenciación: Controla el orden de ejecución de las operaciones.

5.4.1.1 Memoria de Control

La memoria de control almacena microinstrucciones que guían la ejecución de cada instrucción en el simulador. Una representación visual de esta memoria, organizada en filas (microinstrucciones) y columnas (microoperaciones y señales de control), facilita la comprensión del papel que desempeña en la coordinación de la unidad de control (Stallings 2021).

5.4.1.2 Secuenciador

El secuenciador complementa la memoria de control mostrando cómo se controla la secuencia de microoperaciones y las señales de control generadas en cada fase del ciclo de instrucción.

5.4.2 Unidad Aritmético-Lógica (ALU)

La ALU (Arithmetic Logic Unit) realiza operaciones aritméticas y lógicas, como ADD y SUB. Durante el ciclo de instrucción, la unidad de control genera señales específicas que activan las operaciones de la ALU. Por ejemplo, al ejecutar una instrucción ADD, la unidad de control activa las señales necesarias para transferir los operandos desde los registros hacia la ALU y almacenar el resultado en el registro de destino. Todas estas operaciones modifican el registro Flags.

5.4.2.1 Registro de Banderas (Flags)

El registro de banderas Flags almacena las banderas de estado que reflejan el resultado de operaciones aritméticas y lógicas. Por ejemplo, después de una operación de suma, la bandera Z (Zero) se activa si el resultado es cero, lo que permite al procesador tomar decisiones condicionales basadas en este estado.

El registro Flags almacena banderas de estado resultantes de operaciones aritméticas, lógicas, de control y de gestión del flujo. Estas banderas permiten a la Unidad de Control modificar el flujo mediante saltos condicionales o habilitar/deshabilitar servicios (interrupciones).

La Tabla 5.4 presenta una síntesis de las banderas de estado implementadas en esta versión del simulador, detallando su función y relevancia en el procesamiento de instrucciones. Esta información resulta fundamental para comprender el mecanismo de control y la gestión de eventos internos durante la ejecución de programas en arquitectura x86.

Tabla 5.4: Registro Flags: descripción de las banderas
Bit N° Abreviatura Descripción
0 Z Zero: 1 si el resultado = 0x00
1 C Carry: acarreo (suma) o préstamo (resta)
2 O Overflow: desbordamiento aritmético con signo
3 S Sign: copia del bit 7 del resultado
4 I Interrupt Enable: 1 habilita atención de interrupciones hardware

Los bits restantes del registro se reservan para extensiones futuras (no implementados en esta versión).

5.4.2.2 Política de actualización de banderas

Convenciones operativas:

  • Z: se activa (Z = 1) cuando el resultado es 0x00; en otro caso Z = 0.

  • C:

    • ADD: 1 si hay acarreo desde el bit 7 (suma sin signo).

    • SUB y CMP: 1 si destino < fuente (borrow); 0 en caso contrario.

  • O:

    • ADD/SUB/CMP: se actualiza según regla de overflow con signo.
  • S:

    • ADD/SUB/CMP: se actualiza según el signo del resultado (bit 7).
  • I:

    • CLI/STI: CLI pone I=0; STI pone I=1.

    • INT: apila Flags y fuerza I=0.

    • IRET: restaura el registro Flags (todas las banderas).

La Tabla 5.5 expone de manera sistemática la política de actualización de las banderas de estado, diferenciando el comportamiento de cada clase de instrucción. Este detalle resulta esencial para comprender cómo se gestionan las condiciones internas del procesador durante la ejecución de instrucciones, aportando rigor al análisis funcional del simulador.

Tabla 5.5: Política de actualización de banderas por clase de instrucción
Clase Z S C O I
MOV Preserva
ADD Sí (acarreo) Preserva
SUB Sí (borrow) Preserva
CMP Sí (borrow) Preserva
JMP/Jxx Preserva
IN/OUT Preserva
PUSH/POP Preserva Preserva Preserva Preserva Preserva
CALL/RET Preserva Preserva Preserva Preserva Preserva
IRET Restaura Restaura Restaura Restaura Restaura
CLI/STI Preserva I=0/I=1
INT Preserva Preserva Preserva Preserva I=0
HLT Preserva
Nota:
El símbolo – indica que la instrucción no modifica la bandera.

5.4.3 Memoria principal

La memoria principal del simulador se representa mediante una matriz de 16×16 en formato hexadecimal, permitiendo almacenar hasta 256 bytes de datos. Esta capacidad resulta adecuada para los programas de ejemplo utilizados en el curso y, gracias a su diseño simplificado, facilita la comprensión de los conceptos fundamentales asociados a la gestión y organización de la memoria en una computadora.

La Figura 5.7 muestra la estructura visual de la memoria principal, destacando su disposición matricial y la accesibilidad de cada celda para el análisis y la manipulación de datos durante la simulación.

Memoria principal

Figura 5.7: Memoria principal

5.4.4 Buses y multiplexores

Los buses de datos, direcciones y control se representan como un conjunto de líneas que facilitan la comunicación entre los distintos componentes del sistema. Estos buses desempeñan un papel fundamental en el intercambio de información entre la CPU, la memoria y los dispositivos de entrada/salida, asegurando la correcta coordinación y transferencia de datos durante la ejecución de programas. Además, su diseño modular permite la expansión y adaptación del simulador en futuras versiones, favoreciendo la incorporación de nuevas funcionalidades y componentes.

La Figura 5.8 ilustra la estructura y disposición de los buses en el simulador, evidenciando su función como elementos clave para la interconexión y el flujo de información en la arquitectura implementada.

Buses

Figura 5.8: Buses

Dentro de los buses internos de la CPU se incluyen representaciones gráficas de multiplexores, componentes digitales esenciales que permiten seleccionar entre múltiples fuentes de datos o direcciones durante el ciclo de instrucción. Los multiplexores dirigen las señales hacia los registros y la ALU (Unidad Aritmético-Lógica), facilitando el flujo de datos dentro del procesador. Un multiplexor (MUX) funciona como un conmutador digital que conecta datos de una de n fuentes a la salida. Están dotados de entradas de control capaces de seleccionar una y solo una de las entradas de datos para permitir su transmisión desde la entrada seleccionada hacia dicha salida (Mano and Ciletti 2017).

Bibliografía

Mano, M. Morris, and Michael D. Ciletti. 2017. Digital Design: With an Introduction to the Verilog HDL, VHDL, and SystemVerilog. Pearson.
Stallings, William. 2021. Computer Organization and Architecture: Designing for Performance. 11th ed. Boston, MA: Pearson.