Recursos para o Livro Arquitetura e Organização de Computadores

Gabriel P. Silva & José Antonio S. Borges - Editora LTC

https://github.com/Simulador-SimuS/simulador-simus.github.io/blob/main/_layouts/default.html

SimuS

Simulador del Procesador Sapiens

Manual de Uso


1. Introducción

SimuS (Simulador Sapiens) es una herramienta educativa desarrollada para simular el funcionamiento del procesador Sapiens. Este simulador permite a los estudiantes escribir, compilar y ejecutar programas en lenguaje assembly, visualizando en tiempo real el comportamiento del procesador, los registros, las flags y la memoria.

SimuS ofrece funciones avanzadas de depuración, incluyendo ejecución paso a paso, puntos de interrupción (breakpoints), visualización de memoria y puertos de entrada/salida simulados.


2. Interfaz de Usuario

El idioma de la interfaz de usuario puede seleccionarse en portugués, inglés o español haciendo clic en una de las banderas ubicadas en la esquina superior de la ventana principal.

La interfaz de SimuS está dividida en tres paneles principales, cada uno con funciones específicas para facilitar el desarrollo y la depuración de programas.

2.1. Panel Izquierdo - Editor y Ejecución

Este panel contiene tres pestañas que permiten editar código, visualizar errores y realizar el seguimiento de la ejecución:

2.1.1. Pestaña Editor

Área de edición de código assembly con las siguientes características:

2.1.2. Pestaña Errores

Muestra los mensajes de error generados durante la compilación:

2.1.3. Pestaña Ejecución

Visualización del código compilado con funciones de depuración:

2.2. Panel Central - CPU y Controles

Este panel concentra todos los controles de ejecución y la visualización del estado de la CPU:

2.2.1. Botones de Control

Cinco botones con colores distintos para controlar la ejecución:

2.2.2. Barra de Estado

Muestra el estado actual del simulador en texto gris, debajo de los botones de control. Los mensajes incluyen: “Listo”, “Ejecutando…“, “TURBO - Ejecutando…“, “HALT - Programa Finalizado”, entre otros.

2.2.3. Registros

Tres casillas que muestran los valores de los registros principales en hexadecimal:

2.2.4. Instrucción Actual

Casilla con fondo oscuro que muestra el mnemónico de la instrucción a la que apunta actualmente el PC. Ejemplo: LDA #0xFF. Esta visualización con resaltado amarillo dorado facilita el seguimiento de la ejecución.

2.2.5. Flags (Señaladores)

Tres indicadores visuales que muestran el estado de los flags del procesador:

2.2.6. Puertos de Entrada/Salida

Interfaz simulada de periféricos con cuatro componentes:

2.3. Panel Derecho - Visualización de la Memoria

Muestra el contenido de la memoria RAM en formato hexadecimal con navegación:

2.3.1. Barra de Navegación

Controles en la parte superior del panel de memoria:

2.3.2. Cuadrícula de Memoria

Visualización en una cuadrícula hexadecimal con las siguientes características:


3. Barra de Herramientas de Archivo

Ubicada en la parte superior del panel izquierdo, ofrece botones para la gestión de archivos y ventanas auxiliares:

3.1. Ventanas Emergentes

Las ventanas Terminal y Video son ventanas flotantes independientes. Para reposicionarlas, haga clic y arrastre la barra superior de la ventana. El botón circular rojo de la barra de título cierra/oculta la ventana.


4. Flujo de Trabajo Típico

Siga estos pasos para desarrollar y ejecutar programas en SimuS:

  1. Editar el Código: En la pestaña Editor, escriba su programa en assembly. Use comentarios (;) para documentar el código. Recuerde incluir la directiva ORG para definir la dirección inicial y END para marcar el fin del programa.
  2. Compilar: Haga clic en el botón ✔ Compilar. Si hay errores, corríjalos como se indica en la pestaña Errores y compile de nuevo.
  3. Definir Breakpoints (Opcional): En la pestaña Ejecución, haga clic en las líneas donde desea pausar la ejecución. Aparecerá un círculo rojo en la dirección.
  4. Ejecutar: Elija un modo de ejecución:
    • Paso: Para una depuración detallada, instrucción por instrucción.
    • Ejecutar: Para una velocidad normal con visualización.
    • Turbo: Para programas largos, ejecución a máxima velocidad.
  5. Seguir la Ejecución: Observe cómo los registros, flags, memoria y puertos de E/S se actualización en tiempo real. La línea actual se resalta en amarillo en la pestaña Ejecución.
  6. Interactuar con la E/S: Cuando el programa ejecute IN 0, escriba un valor hexadecimal en el campo Entrada (Hex) y presione ENTER. Los valores enviados a través de OUT se muestran automáticamente.
  7. Finalizar: El programa se detiene automáticamente al encontrar HLT. Use el botón Reset para reiniciar y ejecutar nuevamente.
  8. Guardar: Use 💾 Guardar Como… para guardar su trabajo en un archivo.

5. Conjunto de Instrucciones Sapiens

El procesador Sapiens implementa las siguientes categorías de instrucciones:

5.1. Instrucciones de Transferencia de Datos

Mnemónico Nombre Descripción
LDA Load Accumulator Carga el AC con un valor de la memoria o inmediato
STA Store Accumulator Almacena el AC en la memoria
LDS Load Stack Pointer Carga el SP con un valor de 16 bits
STS Store Stack Pointer Almacena el SP en la memoria (16 bits)

5.2. Instrucciones Aritméticas

Mnemónico Nombre Descripción
ADD Addition AC = AC + operando (actualiza flags)
ADC Add with Carry AC = AC + operando + C (actualiza flags)
SUB Subtraction AC = AC - operando (actualiza flags)
SBC Subtract with Carry AC = AC - operando - C (actualiza flags)

5.3. Instrucciones Lógicas

Mnemónico Nombre Descripción
AND Logical AND AC = AC & operando (actualiza flags)
OR Logical OR AC = AC | operando (actualiza flags)
XOR Exclusive OR AC = AC ^ operando (actualiza flags)
NOT Logical NOT AC = ~AC (actualiza flags)

5.4. Instrucciones de Desplazamiento

Mnemónico Nombre Descripción
SHL Shift Left Desplaza el AC 1 bit a la izquierda (bit 0 = 0, C recibe el bit 7)
SHR Shift Right Desplaza el AC 1 bit a la derecha lógico (bit 7 = 0, C recibe el bit 0)
SRA Shift Right Arithmetic Desplaza el AC 1 bit a la derecha aritmético (mantiene el bit 7)

5.5. Instrucciones de Control de Flujo

Mnemónico Nombre Descripción
JMP Jump Salta incondicionalmente a una dirección
JZ Jump if Zero Salta si el flag Z = 1
JNZ Jump if Not Zero Salta si el flag Z = 0
JN Jump if Negative Salta si el flag N = 1
JP Jump if Positive Salta si el flag N = 0
JC Jump if Carry Salta si el flag C = 1
JNC Jump if No Carry Salta si el flag C = 0

5.6. Instrucciones de Subrutina

Mnemónico Nombre Descripción
JSR Jump to Subroutine Guarda el PC en la pila y salta a la subrutina
RET Return Retorna de la subrutina (recupera el PC de la pila)

5.7. Instrucciones de Pila

Mnemónico Nombre Descripción
PUSH Push to Stack Empuja el AC en la pila (mem[SP] = AC, luego SP–)
POP Pop from Stack Saca de la pila hacia el AC (SP++, luego AC = mem[SP])

5.8. Instrucciones de Entrada/Salida

Mnemónico Nombre Descripción
IN Input Lee datos de la puerta especificada hacia el AC
OUT Output Envía el AC a la puerta especificada

Puertos de E/S Disponibles:

Instrucción Función
IN 0 Lee el valor hexadecimal escrito por el usuario
IN 1 Lee el estado de la entrada (1 = dato disponible, 0 = sin dato)
OUT 0 Envía el AC a la pantalla hexadecimal de salida
OUT 2 Limpia el banner de texto
OUT 3 Envía un carácter ASCII al banner de texto (lo añade al final)

5.9. Instrucciones Especiales

Mnemónico Nombre Descripción
NOP No Operation No hace nada (puede usarse para temporización)
HLT Halt Detiene la ejecución del procesador
TRAP Trap Genera una llamada de servicio

Operaciones de TRAP Disponibles:

LDA #20
TRAP VIDEO_CONFIG
OR #0
JNZ ERROR
Instrucción Función
#0 Limpia la terminal de la consola
#1 Lee un carácter de la terminal y lo guarda en el acumulador y en la dirección de memoria del operando
#2 Escribe un carácter desde la dirección de memoria del operando en la terminal
#3 Lee una cadena de la terminal y la guarda en la dirección de memoria del operando
#4 Escribe una cadena a partir de la dirección del operando (hasta encontrar un NULL)
#5 Delay (Espera de 0 a 65535 ms)
#6 Beep (Sintetizador de Audio). Recibe frecuencia y duración como parámetros
#7 Devuelve un número pseudoaleatorio entre 0 y 99 en el acumulador
#20 Configura el display gráfico virtual. El operando apunta a un bloque DW base, donde base es el inicio de la memoria de video.
#21 Limpia la memoria de video con un color. El operando apunta a DB color.
#22 Dibuja un pixel. El operando apunta a DB x, y, color.
#23 Dibuja una línea. El operando apunta a DB x0, y0, x1, y1, color.
#24 Dibuja un rectángulo. El operando apunta a DB x, y, ancho, alto, color, relleno.
#25 Dibuja un círculo. El operando apunta a DB cx, cy, radio, color, relleno.

Display Gráfico Virtual

El display gráfico virtual tiene resolución de 128 × 64 pixels. La memoria de video ocupa 8192 bytes consecutivos, con 1 byte por pixel. La TRAP #20 define qué región de la memoria de 64 KB se usará como buffer. La dirección base debe estar alineada a un múltiplo de 256, y el área base + 8192 no puede superar el límite de la memoria.

La distribución de los pixels es lineal:

dirección = base + (y * 128) + x

Los colores usan el formato de 8 bits RRRGGGBB:

Valor Color aproximado
224 / 0xE0 Rojo
28 / 0x1C Verde
3 / 0x03 Azul
252 / 0xFC Amarillo
255 / 0xFF Blanco

Valores principales de retorno de la TRAP #20:

AC Significado
0 Éxito
1 La dirección base no está alineada a 256 bytes
2 El área de video supera el límite de la memoria
4 Usado por las TRAPs gráficas cuando el video aún no fue configurado

6. Modos de Direccionamiento

El Sapiens soporta cuatro modos de direccionamiento, identificados por los 2 bits más significativos del opcode:

Bits Modo Ejemplo Operación Descripción
00 Directo LDA 50 AC = mem[50] El operando es la dirección en memoria del dato
01 Indirecto LDA @50 AC = mem[mem[50]] El operando apunta a la dirección que contiene la dirección final del dato
10 Inmediato 8 bits LDA #10 AC = 10 El operando es el byte siguiente a la instrucción
11 Inmediato 16 bits LDS #1000 SP = 1000 El operando son los dos bytes siguientes a la instrucción

Observaciones sobre Direccionamiento:


7. Formato de los Operandos

El Sapiens soporta varios tipos de formatos para los operandos de las instrucciones:


8. Directivas del Ensamblador

El ensamblador de SimuS reconoce las siguientes directivas:

Directiva Descripción Ejemplo Efecto
ORG dirección Define la dirección inicial del programa ORG 0 El programa se inicia en la dirección 0
END Marca el fin del código fuente END Última línea del archivo
DB valor[, valor...] Define uno o más bytes (8 bits) DB 0xFF, 10, 1010B Almacena la lista de bytes en la memoria
DW valor[, valor...] Define una o más palabras / words (16 bits) DW 0x1234, 1000 Almacena words en formato little-endian
DS cantidad Define espacio (reserva bytes) DS 10 Reserva 10 bytes en cero
LABEL EQU valor Define una constante TESTE EQU 10 TESTE será igual a 10

Atención: para constantes, use LABEL EQU valor sin dos puntos. La forma LABEL: EQU valor crea primero una etiqueta en la dirección actual y puede no definir la constante como se espera.

Uso de Etiquetas (Labels):

Las etiquetas se pueden definir antes de cualquier instrucción o directiva, terminando con dos puntos:

LOOP:
    LDA VALOR
    JNZ LOOP


9. Ejemplos de Programas

9.1. Eco Simple

Programa que espera la entrada del usuario y devuelve el valor:

; Programa de Eco
ORG 0
LOOP:
    IN 1          ; Lê status
    OR #0         ; Operação para verificar o valor lido
    JZ LOOP       ; Enquanto for zero fica em loop
    IN 0          ; Lê valor
    OUT 0         ; Exibe valor
    HLT
END

9.2. Contador de 0 a 9

Cuenta de 0 a 9 y se detiene:

; Contador
ORG 0
LOOP:
    LDA  CONT     ; Carrega el valor del contador
    OUT 0         ; Muestra el valor
    ADD #1        ; Incrementa
    STA CONT      ; Armazena el nuevo valor
    SUB #10       ; Compara con 10
    JNZ LOOP      ; Continúa si != 10
    HLT
END
CONT: DB 0 

9.3. Subrutina con Pila

Demuestra el uso de JSR, RET y PUSH/POP:

; Paso de parametro por la pila
; Resultado devuelto en el acumulador

ORG 0
    LDA #42          ; Parametro de la subrutina
    PUSH             ; Apila el parametro
    JSR DOBRO        ; JSR apila la direccion de retorno
    OUT 0            ; Muestra el resultado: 84
    HLT

DOBRO:
    ; Al entrar en la subrutina, la cima de la pila contiene
    ; la direccion de retorno colocada por JSR.
    ; Debajo de ella esta el parametro apilado por el programa principal.

    POP              ; Byte bajo de la direccion de retorno
    STA RET
    POP              ; Byte alto de la direccion de retorno
    STA RET+1
    POP              ; Recupera el parametro
    STA PARAM
    ; Calcula PARAM * 2
    LDA PARAM
    ADD PARAM
    STA RESULT
    ; Restaura la direccion de retorno.
    ; RET desapila primero el byte bajo y despues el byte alto.
    ; Como PUSH apila y decrementa SP, apilamos primero el byte alto.

    LDA RET+1
    PUSH
    LDA RET
    PUSH
    LDA RESULT       ; Devuelve el resultado en el acumulador
    RET

RET:    DW 0         ; Direccion de retorno guardada por la subrutina
PARAM:  DB 0
RESULT: DB 0

END 0

9.4. Display Gráfico Virtual

Configura la memoria de video en 0x4000, limpia la pantalla, dibuja un rectángulo relleno, una línea y un círculo:

ORG 0

MAIN:
    LDA #20
    TRAP VIDEO_CONFIG
    OR #0
    JNZ ERROR

    LDA #21
    TRAP LIMPIAR

    LDA #24
    TRAP RECTANGULO

    LDA #23
    TRAP LINEA

    LDA #25
    TRAP CIRCULO

    HLT

ERROR:
    HLT

VIDEO_CONFIG:
    DW VIDEO_BASE

LIMPIAR:
    DB 3              ; azul

RECTANGULO:
    DB 48, 16, 32, 32, 224, 1

LINEA:
    DB 0, 63, 127, 0, 28

CIRCULO:
    DB 64, 32, 18, 252, 0

VIDEO_BASE EQU 16384 ; 0x4000

END MAIN

10. Resolución de Problemas Comunes

Error: “Instrucción Inválida”

Error: “Etiqueta No Definida”

El programa no se ejecuta después de compilar

El Breakpoint no funciona

La memoria no se actualiza durante la ejecución

IN no lee el valor escrito

El display gráfico no muestra el dibujo


11. Consejos y Buenas Prácticas


12. Conclusión

SimuS es una herramienta completa para el aprendizaje de arquitectura de computadores y programación en assembly. A través de su interfaz intuitiva y funciones avanzadas de depuración, los estudiantes pueden experimentar conceptos fundamentales como:

Este manual cubre los aspectos esenciales del simulador. Para preguntas adicionales o soporte técnico, consulte la documentación del procesador Sapiens o póngase en contacto con el desarrollador.

¡Buenos estudios y buena programación!