5.2 Diseño del Simulador

El simulador implementado adopta la arquitectura de Von Neumann, reconocida por su simplicidad conceptual y operativa. En este modelo, los datos y las instrucciones comparten una única memoria, lo que permite tratar las instrucciones como datos. Esta característica facilita técnicas como la ejecución dinámica y la optimización del rendimiento (Stallings 2021).

VonSim2 sirvió como referencia por su enfoque educativo e interfaz intuitiva. Sobre esta base se desarrolló VonSim83, adaptado para operar con registros y memoria de 8 bits y diseñado para el aprendizaje progresivo (Facundo Quiroga 2020).

La arquitectura detallada de VonSim, con su amplio repertorio de instrucciones y componentes, ofrece una visión integral del sistema. Sin embargo, dicha riqueza funcional puede abrumar a estudiantes en etapas iniciales. Por esta razón, VonSim8 introduce una simplificación estrategica, con el objetivo de reducir la carga cognitiva en etapas iniciales, facilitando así una apropiación gradual de los conceptos fundamentales. A partir de esta base, se introdujeron diversas modificaciones en los componentes, instrucciones y funcionalidades del simulador, priorizando aquellos aspectos conceptuales que se abordan en el programa de la asignatura.

VonSim (Facundo Quiroga 2020) es una herramienta diseñada específicamente para la enseñanza y el aprendizaje de la arquitectura y organización de computadoras. Sus principales características la posicionan como una solución educativa integral:

Características técnicas y pedagógicas de VonSim:

  1. Entorno integrado de desarrollo y simulación: Proporciona un entorno completo que incluye editor de código ensamblador con resaltado de sintaxis y un simulador para la ejecución de programas, facilitando el proceso de aprendizaje práctico (Facundo Quiroga 2020).

  2. Fundamento en arquitectura real: Se basa en el procesador Intel 8088, proporcionando una referencia histórica y técnicamente relevante para el estudio de la evolución de las arquitecturas de computadoras (Intel Corporation 1979).

  3. Componentes esenciales para el estudio: Incluye cuatro registros multipropósito de 16 bits, memoria principal de 32 kB, bus de direcciones de 16 bits y bus de datos de 8 bits, abarcando los elementos fundamentales para la comprensión de la arquitectura von Neumann (Stallings 2021).

  4. Gestión completa de interrupciones: Implementa tanto interrupciones por software (entrada/salida de datos) como interrupciones por hardware mediante un controlador de interrupciones programable (PIC), cubriendo aspectos fundamentales de la operación del sistema (John L. Hennessy and Patterson 2017a).

  5. Simulación de periféricos: Incorpora dispositivos como reloj, llaves, LEDs e impresora Centronics, inspirados en los especificados por la familia iAPX 88 de Intel, permitiendo simular interacciones complejas con el sistema.

  6. Enfoque pedagógico mediante simplificaciones estratégicas: No pretende ser un emulador fiel del 8088, sino una herramienta educativa que implementa simplificaciones deliberadas (repertorio de instrucciones reducido y codificación simplificada) para facilitar la comprensión en contextos educativos (Patt and Patel 2019).

  7. Desarrollo académico especializado: Creado por Facundo Quiroga, Manuel Bustos Berrondo y Juan Martín Seery, con colaboración de Andoni Zubimendi y César Estrebou, específicamente para las cátedras de Organización de Computadoras y Arquitectura de Computadoras de la Facultad de Informática de la Universidad Nacional de La Plata, garantizando su alineación con objetivos curriculares específicos.

  8. Fundamento en experiencia previa: Se apoya en el simulador MSX88, desarrollado en 1988 por Rubén de Diego Martínez para la Universidad Politécnica de Madrid, aprovechando décadas de experiencia acumulada en simuladores educativos.

  9. Accesibilidad y sostenibilidad: Distribuido bajo licencia GNU Affero General Public License v3.0 con código fuente disponible en GitHub, y documentación bajo licencia CC BY-SA 4.0, facilitando su estudio, modificación y mejora continua (Open Source Initiative 2024).

En síntesis, VonSim constituye una herramienta robusta y accesible que simplifica y facilita el aprendizaje de conceptos complejos de arquitectura de computadoras mediante simulación práctica y una interfaz pedagógicamente orientada.

Las modificaciones principales de VonSim8, alineadas con objetivos pedagógicos, incluyen:

Del registro de estado del simulador original se ocualtaron las banderas I, O y S ya que en los primeros ejericios de ensamblador no se requiere su uso ya que se trabaja solamente con números enteros positivos, posteriormente las mismas se pueden habilitar en el menu configuración del simulador.

Registro de estado

Figura 5.7: Registro de estado

El flag de interrupcion I solo se muestra cuando el programa lo requiere, por ejemplo, al ejecutar una instrucción de interrupción como INT o IRET. Esto permite a los estudiantes observar cómo se activa y desactiva este flag en función de las operaciones realizadas.

Registro de estado I

Figura 5.8: Registro de estado I

Se modifico el menu de los controles del simulador.
Controles del simulador

Figura 5.9: Controles del simulador

Se eliminaron los registros de 16 bits y se redujo el tamaño de los registros a 8 bits, lo que simplifica la representación y manipulación de datos. Esta decisión se fundamenta en la necesidad de reducir la complejidad del modelo para facilitar la comprensión de los conceptos fundamentales de la arquitectura de computadoras. Tambien se unifico el criterio del diseño de los registro, ahora todos los registros tienen una entrada y una salida independiente, lo que permite una visualización más clara de cómo se transfieren los datos entre los registros y la ALU (Unidad Aritmético Lógica). Esta modificación es esencial para comprender el flujo de datos en el ciclo de instrucción y la interacción entre los componentes del procesador. Tambien se ocultaron los registros registro SP y (ri e id) que se habilitan automaticamente al ejecutar una instrucción que requiera su uso.

Registro de 8 bits

Figura 5.10: Registro de 8 bits

Se elimino el uso de los registros temporales de la ALU (left y rigth).

Eliminación registro temporales left y rigth

Figura 5.11: Eliminación registro temporales left y rigth

La memoria principal se modela como una matriz de 16×16 expresada en hexadecimal, lo que permite almacenar hasta 256 bytes de datos.

Memoria principal

Figura 5.12: Memoria principal

Resaldo de la direccion de memoria apuntada por el registro IP.

Resaltado registro IP

Figura 5.13: Resaltado registro IP

Cuando el progrma tiene instrucciones INT o de manejo de pila se resalta en memoria el el vector de interrucciones, 8 posiciones de memoria desde 0x00 a 0x07 y la dirección apuntada por el registro SP:

Resaltado vector de interrupciones y registro SP

Figura 5.14: Resaltado vector de interrupciones y registro SP

Visor de instrucciones y datos del programa en memoria, pudiendo ver la instruccion y su tamaño en bytes que ocupa en memoria, ademas la etiqueta asociada a los datos.

Resaltado vector de interrupciones y registro SP

Figura 5.15: Resaltado vector de interrupciones y registro SP

En el VonSim cuando se escribe un programa en el editor del simulador es obligatorio que la sección de codigo inicie con la directiva org 0x2000h, porque el simulador comienza a ejecutar la primer instruccion del programa a partir de la dirección de memoria 0x2000h, esto se indica al comienzo del programa mediante la directiva org 0x2000h y los datos del programa generalmente se cargan a partir de la dirección de memoria 0x1000h mediante la directiva org 0x1000h.

En VonSim8 no es obligatorio la directiva org para indicar la dirección de inicio del programa sino opcional, por default si el programa no tiene la directiva org la primer instruccion del programa comienza a cargarse en la dirección 0x00h, y en caso que el programa tenga instrucciones de interrupcion INT el programa se cargará a partir de la direccion 0x08h para dejar espacio al vector de interrupciones. VonSim8 tambien permite cargar el programa de manera similar como VonSim pero en utilizar la directiva org 0x2000h utiliza org 0x20h y el simulador comienza a ejecutar la instruccion que se encuentra en la dirección 0x20h de la memoria vez de cargar en la posicion ya que el simulador asigna automáticamente la dirección 0x00 al primer byte del programa. Esto simplifica la escritura de programas y evita errores comunes relacionados con la asignación manual de direcciones.

Pero si el programa requiere una dirección de inicio específica, se puede utilizar la directiva org para establecerla. Por ejemplo, org 0x20h indicaría que el programa debe comenzar en la dirección 0x20 de la memoria. Por compatibilidad con el simulador VonSim, se mantiene la directiva org para aquellos usuarios que deseen especificar una dirección de inicio diferente a la predeterminada. Sino se especifica la directiva org en el programa el simulador comienza a ejecutar el programa desde la dirección 0x00h, en caso de que el programa tenga instrucciones de interrupción INT, el simulador asigna automáticamente la dirección 0x08h al primer byte del programa, dejando espacio para el vector de interrupciones.

  1. Simplificación del repertorio instruccional para una introducción gradual;

  2. Reducción a registros y memoria de 8 bits, coherente con la escala de enseñanza;

  3. Interfaz gráfica esquemática que muestra el flujo de ejecución;

  4. Funciones interactivas para observar explícitamente el ciclo de instrucción y la interacción de componentes.

Las modificaciones implementadas se alinean con los contenidos curriculares de la asignatura y están fundamentadas en los principios del aprendizaje activo (Bonwell and Eison 1991).

5.2.1 Estructura del VonSim8

Esta sección describe la estructura del simulador VonSims8, el diseño de los registros fue concebido para facilitar la comprensión de los modos de direccionamiento y del ciclo de instrucción, ambos considerados fundamentos clave en el estudio de la Arquitectura de Computadoras (Stallings 2021). Se describe en la siguiente tabla 5.3 los componentes principales del simulador, junto con sus características y funcionalidades específicas. Esta tabla proporciona una visión general de la arquitectura del simulador, destacando los elementos clave que componen su estructura y su propósito pedagógico.:

Tabla 5.3: Estructura VonSim8
Componente Características
Arquitectura Von Neumann, memoria compartida para datos e instrucciones.
Registros 4 registros de propósito general (AL, BL, CL y DL) de 8 bits cada uno.
4 registros de propósito específico:
  • IP (Instruction Pointer)
  • IR (Instruction Register)
  • SP (Stack Pointer)
  • RS (registro de estado)
2 registros dedicados a la transferencia de información entre la CPU y la memoria principal: el MAR (Memory Address Register), encargado de almacenar direcciones de memoria, y el MBR (Memory Buffer Register), que contiene los datos a transferir.
2 registros temporales (ri: temporal de direcciones y id: temporal de datos) que se utilizan para conservar valores temporales durante la ejecución de una instrucción.
Memoria Capacidad de direccionamiento de 256 posiciones de memoria, cada una de un byte.
Buses Sistema de buses compuesto por un bus de datos y un bus de direcciones, ambos de 8 bits, lo cual limita el espacio de direccionamiento a 256 posiciones de memoria.
Instrucciones Las instrucciones poseen una longitud variable (1, 2 o 3 bytes) y admiten diversos modos de direccionamiento: registro a registro, directo, indirecto e inmediato.

La Figura 5.16 presenta una visión esquemática de la arquitectura general del simulador. En ella se distinguen los flujos de datos y de control, representando gráficamente la interacción entre los distintos módulos funcionales durante la ejecución de programas. Dicha representación facilita la comprensión estructural del sistema y su analogía con una arquitectura computacional real, simplificada para fines educativos.

Arquitectura general del simulador

Figura 5.16: Arquitectura general del simulador

La memoria principal se modela como una matriz de 16×16 expresada en hexadecimal, lo que permite almacenar hasta 256 bytes de datos. Esta capacidad es suficiente para la mayoría de los programas de ejemplo utilizados en el curso, y su diseño simplificado facilita la comprensión de los conceptos fundamentales de la memoria en una computadora.

Memoria principal

Figura 5.17: Memoria principal

El bus de datos, direcciones y control se implementa como un conjunto de líneas que permiten la comunicación entre los distintos componentes del sistema. Este bus es esencial para el intercambio de información entre la CPU, la memoria y los dispositivos de entrada/salida, y su diseño modular permite una fácil expansión en futuras versiones del simulador.

Buses

Figura 5.18: Buses

El simulador incluye la representación de un teclado y una pantalla con el objetivo de emular la interacción básica entre el usuario y el sistema. El teclado se modela como un vector de 16 posiciones, cada una capaz de almacenar un carácter ASCII. La pantalla, por su parte, se representa como una matriz de 16×16 que permite visualizar caracteres, facilitando así la comprensión del manejo de entrada y salida de datos en una arquitectura computacional simplificada.

Teclado y pantalla

Figura 5.19: Teclado y pantalla

La elección de estos bloques funcionales responde tanto a la necesidad de modelar componentes esenciales de una computadora real como a criterios pedagógicos de modularidad y claridad conceptual. La Tabla 5.4 resume los principales bloques que conforman la arquitectura simulada, junto con una breve descripción de su funcionalidad.

Tabla 5.4: Bloques funcionales principales
Bloque Funcional Descripción
Unidad Central de Procesamiento (CPU) Simulación de registros, unidad de control (UC) y unidad aritmético-lógica (ALU).
Memoria Estructura de memoria y simulación de operaciones de lectura y escritura.
Sistema de Entrada/Salida (E/S) Interacción con periféricos y manejo de interrupciones.
Bus de datos, direcciones y control Modelado de la comunicación entre componentes.

5.2.2 Repertorio de instruciones

El repertorio de instrucciones se diseñó como una abstracción deliberada inspirada en la arquitectura x86, con el objetivo de optimizar los procesos de enseñanza y aprendizaje en entornos educativos. En una etapa inicial del proceso de enseñanza, se incluyen únicamente aquellas instrucciones esenciales que permiten introducir progresivamente los contenidos básicos de la asignatura Arquitectura de Computadoras. Este enfoque progresivo permite introducir los conceptos fundamentales de manera accesible, minimizando la complejidad innecesaria que podría obstaculizar la comprensión en las etapas iniciales del aprendizaje (John L. Hennessy and Patterson 2017a; Tanenbaum 2016). La Tabla 5.5 muestra un conjunto reducido de instrucciones que abarca las operaciones más frecuentes y pertinentes para una etapa introductoria de aprendizaje. Este repertorio se centra en las instrucciones de transferencia y procesamiento de datos, así como en las instrucciones de control de flujo, permitiendo al estudiante familiarizarse con los conceptos básicos de la arquitectura x86 sin la complejidad adicional de un repertorio completo.

Las instrucciones del simulador VonSim8 se dividen en dos categorías principales: las instrucciones de transferencia y procesamiento de datos, y las instrucciones de control de flujo. Las primeras permiten mover datos entre registros y memoria, realizar operaciones aritméticas y lógicas, y manipular el contenido de los registros. Las segundas permiten alterar el flujo de ejecución del programa mediante saltos condicionales e incondicionales, así como la detención del procesador.

Tabla 5.5: Tabla de instrucciones de VonSim8
Instrucciones nemónico Acción
Transferencia de datos MOV Copiar
Procesamiento de datos ADD Sumar
SUB Restar
CMP Comparar
Control de flujo JMP Salto incondicional
JZ Salto condicional si Z=1
JC Salto condicional si C=1
HLT Detiene CPU

En base a las entrevistas con los docentes y el análisis de los contenidos del curso, a continuación se establece para cada categorías de instrucciones su uso pedagógico esperado:

  • Transferencia y procesamiento de datos: Instrucciones que permiten mover datos entre registros y memoria y realizar operaciones aritméticas. Estas instrucciones son fundamentales para la comprensión del flujo de datos en una arquitectura computacional mostrando como se llevan a cabo operaciones aritméticas como de lenguaje de alto nivel como Python:
x=2
y=3
z=0
z = x + y

Su traduccion a ensamblador sería:

```assembly
x db 2
y db 3
z db 0
mov AL, x   ;Se carga el valor de x (2) en AL
add AL, y   ;Se suma el valor de y (3) a AL (2) = 5
mov z, AL   ;Se guarda el valor del registro AL (5) en z 
hlt
```
  • Control de flujo: Instrucciones que permiten alterar el flujo de ejecución del programa mediante saltos condicionales e incondicionales, así como la detención del procesador. Estas instrucciones son esenciales para comprender cómo se controlan las decisiones y el flujo de ejecución en un programa. Por ejemplo, permiten implementar estructuras condicionales similares a las de lenguajes de alto nivel como Python:
x=2
y=3
z=0
if x == y:
  z = y  + x

Su traduccion a ensamblador sería:

```assembly

x db 2 y db 3 z db 0 mov AL, x cmp AL, y jz EsIgual jmp Fin EsIgual: add AL, y mov z, AL Fin: hlt ```

x=2
y=3
z=0
if x < y:
  z = y  + x

Su traduccion a ensamblador sería:

```assembly

x db 2 y db 3 z db 0 mov AL, x cmp AL, y jc EsMenor jmp Fin EsMenor: add AL, y mov z, AL Fin: hlt ```

Por ejemplo, la estructura iterativa while en Python:

x = 0
suma = 0

while x < 10:
    suma = suma + x
    x = x + 1

Su traduccion a ensamblador sería:

```assembly

x db 1
suma db 0
Condicion: cmp x, 10 jc Bucle ; si x < 10 salta a etiqueta Bucle: jmp FinBucle ; si no salta a la etiqueta FinBucle: Bucle: mov BL, x add suma, BL add x, 1 jmp Condicion ; salta a Condicion: FinBucle: hlt ```

Tratamiento de vectores: El simulador permite trabajar con vectores y matrices, lo que facilita la comprensión de cómo se manejan estructuras de datos más complejas en una arquitectura computacional. Por ejemplo, el siguiente código en Python busca el máximo de un vector:

# Búsqueda del máximo en un vector
vector = [5, 2, 10, 4, 5, 0, 4, 8, 1, 9]
maximo = 0

for i in range(len(vector)):
    if vector[i] > maximo:
        maximo = vector[i]

Su traduccion a ensamblador sería:

```assembly

max db 0 vector db 5, 2, 10, 4, 5, 0, 4, 8, 1, 9 mov CL, 0 ; contador mov BL, offset vector ; obtiene la dirección del primer elemento del vector Condicion: cmp CL, 10 jc Bucle ; si x < 10 salta a etiqueta Bucle jmp FinBucle ; si no salta a la etiqueta FinBucle Bucle: mov AL, [BL] ; AL = vector[indice] cmp AL, max jc Proximo ; si AL < max, salta a Proximo mov max, AL ; si no, actualiza max Proximo: add BL, 1 ; BL = BL + 1 add CL, 1 ; CL = CL + 1
jmp Condicion FinBucle: hlt```

Estas instrucciones permiten a los estudiantes comprender cómo se ejecutan las operaciones aritméticas en la computadora, cómo se transfieren los datos entre registros y memoria, y cómo se controla el flujo de ejecución de un programa. Estas categorías de instrucciones se seleccionaron cuidadosamente para proporcionar una base sólida en los conceptos fundamentales de la arquitectura x86, permitiendo a los estudiantes familiarizarse con las operaciones más comunes y relevantes sin la complejidad adicional de un repertorio completo.

Estas categorías se alinean con los objetivos pedagógicos del curso, permitiendo a los estudiantes familiarizarse con los conceptos básicos de la arquitectura x86 sin la complejidad adicional de un repertorio completo.

A traves de la implementación de estas instrucciones, el simulador VonSim8 busca proporcionar una experiencia de aprendizaje que facilite la comprensión de los principios fundamentales de la arquitectura de computadores, al tiempo que se minimiza la carga cognitiva en las etapas iniciales del aprendizaje. Permite al alumno entender como se ejecutan los operaciones artimeticas en la computadora, como se transfieren los datos entre registros y memoria, y como se controla el flujo de ejecución de un programa.

5.2.3 Formato de instrucciones

Las instrucciones del simulador VonSim8 se definen con un formato de 1 a 3 bytes, donde el primer byte contiene el código de operación (opcode) y los siguientes bytes pueden contener operandos adicionales según el modo de direccionamiento utilizado. El opcode determina la operación a realizar, mientras que los operandos especifican los datos o registros involucrados en la operación.

Tabla 5.6: Tabla de formato de instrucciones
Tipo Operandos Ejemplo
Transferencia y procesamiento 2 MOV operando-destino, operando-fuente
Control 1 / cero JMP operando / HLT

5.2.4 Modos de direccionamiento

Los modos de direccionamiento definidos son:

  • Registro a registro (Rx,Ry): operandos son registros del procesador y Rx indica registro destino y Ry indica registro fuente.

  • Directo ([M]): un operando es un registro y el otro operando es el contenido de una dirección de memoria [M].

  • Indirecto por registro ([BL]): la dirección del operando se encuentra en el registro [BL].

  • Inmediato (d): un operando es un valor contenido en la instrucción.

Estos modos de direccionamiento permiten al simulador representar una variedad de operaciones que abarcan desde la manipulación directa de registros hasta el acceso a memoria, proporcionando una base sólida para la comprensión del flujo de datos en una arquitectura computacional. La Tabla 5.7 resume los modos de direccionamiento implementados en el simulador, junto con ejemplos de uso y su propósito pedagógico.

Tabla 5.7: Tabla de modos de direccionamiento
Tipo Operación Parámetros
A: Entre registros Operandos son registros Rx, Ry
B: Cargar a registro Operando destino es registro Rx y el operando fuente puede ser:
  • dirección [M]
  • dirección registro [BL]
  • valor en la instrucción d
Transferencia y procesamiento C: Almacenar en memoria Operando destino puede ser:
  • dirección [M]
  • dirección registro [BL])
y operando fuente puede ser:
  • Registro: Ry
  • valor en la instrucción d
Control D: control de flujo Si tiene operando es una dirección de memoria M (*)
Nota:
Las instrucciones de transferencia y procesamiento tienen los mismos modos de direccionamiento A, B y C.

5.2.5 Codificación de instrucciones

El formato de las instrucciones se basa en la codificación binaria, donde cada instrucción se representa mediante un código de operación (opcode) seguido de los operandos. Las instrucciones del simulador VonSim8 se dividen en dos categorías principales: las instrucciones de transferencia y procesamiento de datos, y las instrucciones de control de flujo. Cada instrucción se codifica en un formato binario específico, que incluye un código de operación (opcode) y, en algunos casos, operandos adicionales. La Tabla 5.9 presenta una lista de las instrucciones implementadas en el simulador, junto con su acción correspondiente y su codificación binaria.

Tabla 5.8: Tabla de instrucciones y acciones
Tipo Ejemplo Acción
A: Entre registros MOV Rx, Ry Rx ← Ry
ADD Rx, Ry Rx ← Rx + Ry
SUB Rx, Ry Rx ← Rx - Ry
CMP Rx, Ry Rx - Ry *
B: Cargar a registro MOV Rx, [M] Rx ← Mem[Dirección]
MOV Rx, [BL] Rx ← Mem[BL]
MOV Rx, d Rx ← dato
ADD Rx, [M] Rx ← Rx + Mem[Dirección]
ADD Rx, [BL] Rx ← Rx + Mem[BL]
ADD Rx, d Rx ← Rx + dato
SUB Rx, [M] Rx ← Rx - Mem[Dirección]
SUB Rx, [BL] Rx ← Rx - Mem[BL]
SUB Rx, d Rx ← Rx - dato
CMP Rx, [M] Rx - Mem[Dirección] (*)
CMP Rx, [BL] Rx - Mem[BL] (*)
CMP Rx, d Rx - dato (*)
C: Almacenar en memoria MOV [M], Ry Mem[Dirección] ← Rx
MOV [BL], Ry Mem[BL] ← Rx
MOV [M], d Mem[Dirección] ← dato
MOV [BL], d Mem[BL] ← dato
ADD [M], Ry Mem[Dirección] ← Mem[Dirección] + Rx
ADD [BL], Ry Mem[BL] ← Mem[BL] + Rx
ADD [M], d Mem[Dirección] ← Mem[Dirección] + dato
ADD [BL], d Mem[BL] ← Mem[BL] + dato
SUB [M], Ry Mem[Dirección] ← Mem[Dirección] - Rx
SUB [BL], Ry Mem[BL] ← Mem[BL] - Rx
SUB [M], d Mem[Dirección] ← Mem[Dirección] - dato
SUB [BL], d Mem[BL] ← Mem[BL] - dato
CMP [M], Ry Mem[Dirección] - Rx
CMP [BL], Ry Mem[BL] - Rx
CMP [M], d Mem[Dirección] - dato
CMP [BL], d Mem[BL] - dato
D: control de flujo JMP M IP ← Dirección
JC M Si C = 1 entonces IP ← Dirección
JZ M Si Z = 1 entonces IP ← Dirección
HLT Detiene el procesador
Nota *:
La instrucción CMP no almacena el resultado de la operación en el operando destino.
Tabla 5.9: Tabla de codificación de instrucciones
CodOp Instrucción Byte Codificación
0 MOV Rx, Ry 1 0000 XXYY
1 MOV Rx, [M] 2 0001 XX00 MMMMMMMM
1 MOV Rx, [BL] 1 0001 XX01
1 MOV Rx, D 2 0001 XX10 MMMMMMMM
2 MOV [M], Ry 2 0010 00YY MMMMMMMM
2 MOV [BL], Ry 2 0010 01YY
2 MOV [M], D 3 0010 1100 MMMMMMMM dddddddd
2 MOV [BL], D 2 0010 1101 MMMMMMMM
3 ADD Rx, Ry 1 0011 XXYY
4 ADD Rx, -- Carga en registro 0100 ---- --------
5 ADD [M], -- Almacenar en memoria 0101 ---- -------- --------
6 SUB Rx, Ry 1 0110 XXYY
7 SUB Rx, -- Carga en registro 0111 ---- --------
8 SUB [M], -- Almacenar en memoria 1000 ---- -------- --------
9 CMP Rx, Ry 1 1001 XXYY
A CMP Rx, -- registro - memoria 1010 ---- --------
B CMP [M], -- memoria - registro 1011 ---- -------- --------
C JMP M 1 1100 0000 MMMMMMMM
C JC M 1 1100 0001 MMMMMMMM
C JZ M 1 1100 0011 MMMMMMMM
C Jxx M 1 1100 ffff MMMMMMMM
F HLT 1 1111 ----

Considerando:

  • ____: Código de operación de la instrucción, número de 4 bits.

  • XX o YY: Índices de registros, número entre 0 y 3, cada índice es de 2 bits.

  • 00: Junto con el código de operación indica si la operación es tipo B o C.

  • M: Dirección de memoria, número de 8 bits.

  • ffff: representan el comportamiento de la instrucción, número de 4 bits.

  • d: Dato inmediato, número de 8 bits.

  • MMMMMMMM: Dirección de memoria, número de 8 bits.

  • dddddddd: Dato inmediato, número de 8 bits.

Tabla 5.10: Tabla de registros del simulador
Registros R Binario Decimal
AL 00 0
BL 01 1
CL 10 2
DL 11 3
Nota:
Los registros AL, BL, CL y DL corresponden a registros de propósito general de 8 bits.

El formato ampliado para las instrucciones incluye los siguientes casos tabla 5.11:

Tabla 5.11: Tabla de codificación de instrucciones ampliado
Tipo Operación Codificación Parámetros
Transferencia y procesamiento A: entre registros ____XXYY XX = Registro destino, YY = Registro fuente
B: Cargar a registro ____XX00 MMMMMMMM XX00 = Registro destino y M = Dirección de memoria
____XX01 XX01 = Registro destino y direccion en registro [BL]
____XX00 dddddddd XX10 = Registro destino y d = Dato inmediato
C: Almacenar en memoria ____00YY MMMMMMMM dddddddd YY = Registro fuente, M = Dirección de memoria, d = Dato Inmediato
Control D: control de flujo ____ffff MMMMMMMM ffff = funcionalidad, M = Dirección de memoria
Nota:
d = dato inmediato, no puede ser destino de la instrucción.

Bibliografía

Bonwell, Charles C., and James A. Eison. 1991. “Active Learning: Creating Excitement in the Classroom.” ASHE-ERIC Higher Education Report 1.
Facundo Quiroga, Juan Martín Seery, Manuel Bustos Berrondo. 2020. “VonSim - Simulador de Arquitectura de von Neumann.” https://vonsim.github.io/.
Hennessy, John L., and David A. Patterson. 2017a. Computer Architecture: A Quantitative Approach. 6th ed. Boston: Morgan Kaufmann.
Intel Corporation. 1979. Intel 8086 Family User’s Manual. Intel Corporation. https://bitsavers.org/components/intel/8086/9800722-03_The_8086_Family_Users_Manual_Oct79.pdf.
Open Source Initiative. 2024. “Open Source Licenses: Understanding GPL, MIT, and Apache Licenses.” https://opensource.org/licenses/.
Patt, Yale N., and Sanjay J. Patel. 2019. Introduction to Computing Systems: From Bits and Gates to c and Beyond. 3rd ed. New York: McGraw-Hill Education.
Stallings, William. 2021. Computer Organization and Architecture: Designing for Performance. 11th ed. Boston, MA: Pearson.
Tanenbaum, Andrew S. 2016. Structured Computer Organization. Pearson Education India.