Simulador del Procesador Básico. Manual en línea
por Germán Fabregat, noviembre de 2002.
fabregat@icc.uji.es
Aquí tienes una versión en texto llano.
Índice
- Introducción
- Descripción del Procesador Básico
- Conjunto de instrucciones
- Instrucciones de transferencia de constantes
- Instrucciones de ALU
- Instrucciones de salto
- Instrucciones de entrada/salida
- Instrucciones de acceso indirecto
- Instrucciones especiales y de control
- Gestión de las excepciones
- Dispositivos de entrada/salida
- Barra de LEDS
- Display numérico
- Teclado hexadecimal
1. INTRODUCCIÓN
El Procesador Básico (PB) ha sido concebido como una máquina sencilla para el
aprendizaje del funcionamiento de un computador en los primeros cursos de Ingeniería
Informática, Ingeniería Técnica en Informática de
Gestión e Ingeniería Técnica en Informática de Sistemas de la Universitat
Jaume I.
El simulador del PB ha sido desarrollado en SmallTalk en el excelente entorno
VisualWorks (
http://www.cincom.com), e implementa el propio PB, una memoria
de datos de 32 posiciones y una de instrucciones de 128 (en la imagen distribuida),
así como diversos dispositivos de entrada y salida.
El sistema se distribuye como una imagen (
pb.im) para ser ejecutada sobre la
máquina virtual SmallTalk incluida en el entorno VisualWorks, constituyendo una
aplicación independiente.
2. DESCRIPCIÓN DEL PROCESADOR BÁSICO
El PB es una máquina simple pensada para comprender fácilmente los principios del
funcionamiento de los computadores. Sus principales características son:
- Organización RISC sin ejecución solapada de instrucciones.
- Trabaja con datos no tipados, aunque por las instrucciones implementadas actualmente estos
son enteros sin límite de tamaño.
- Su memoria de datos está constituida por lo que en un procesador RISC sería el banco
de registros. De esta forma, el modo de direccionamiento básico es el directo.
- Trabaja con instrucciones textuales, por lo que la memoria de instrucciones contiene texto.
- Funciona en dos modos, básico y avanzado. En el segundo es capaz de acceder a dispositivos
de E/S y de gestionar excepciones vectorizadas.
Los registros internos del PB son:
- El contador de programa.
- El registro de instrucciones, que en el simulador aparece también dividido en sus campos.
- Dos registros de entrada de la unidad aritmético lógica.
- Un registro de salida de la unidad aritmético lógica.
- Un registro de interrupciones.
3. CONJUNTO DE INSTRUCCIONES
Las instrucciones se codifican mediante un mnemónico seguido de
hasta tres operandos, que se separan por comas. Los operandos
que impliquen direcciones de memoria de datos serán de la forma
d0, d1, d30 etcétera; los que indiquen direcciones de memoria de instrucciones
o constantes, serán exclusivamente un número en base 10.
Las instrucciones del PB se dividen en los siguientes tipos:
A continuación se describen estos tipos y las instrucciones propias de cada uno de ellos.
3.1. Instrucciones de transferencia de constantes.
Son instrucciones con dos operandos: una posición de memoria destino y una constante
fuente. Sirven para cargar constantes en posiciones de memoria. Se justifican porque
no existe un registro fijo a cero como en la mayor parte de procesadores RISC, por lo
que sin ellas cualquier carga de constantes requeriría de dos intrucciones para
verificarse.
Solo existe una instrucción en este grupo:
- movec mem, cte (ej. movec d7, 32 d7 = 32)
3.2. Instrucciones de ALU.
Estas instrucciones realizan transformación de los datos mediante operaciones clásicas de ALU
y algunas algo más complejas. Todas ellas tienen tres operandos, de los cuales el más próximo
al mnemónico es el destino y los otros dos fuentes.
Se dividen en dos grandes grupos:
A. Operaciones con valores inmediatos (constantes).
El segundo operando fuente es una constante. Hay dos intrucciones de este grupo:
- sumac mem, mem, cte (ej. sumac d7, d6, 14 d7 = d6 + 14)
- restac mem, mem, cte (ej. restac d7, d6, 14 d7 = d6 - 14)
B. Operaciones sobre memoria.
Los tres operandos residen en memoria. Hay cinco operaciones de este grupo. Las dos primeras
son básicas:
- suma mem, mem, mem (ej. suma d7, d6, d5 d7 = d6 + d5)
- resta mem, mem, mem (ej. resta d7, d6, d5 d7 = d6 - d5)
y las tres restantes son más complejas -no cabrían en una ALU tradicional de una máquina simple:
- multiplica mem, mem, mem (ej. multiplica d7, d6, d5 d7 = d6 x d5)
- divide mem, mem, mem (ej. divide d7, d6, d5 d7 = d6 / d5; cociente de la división entera)
- modulo mem, mem, mem (ej. modulo d7, d6, d5 d7 = d6 mod d5; resto de la división entera)
Estas dos últimas, divide y módulo, pueden generar una excepción de división por cero.
3.3. Instrucciones de salto.
Se incluyen en este grupo todas las instrucciones de control del flujo del programa. Todas las
direcciones de destino son absolutas y, en la mayor parte de los casos, se especifican mediante
constantes. Se distinguen dos grupos principales, saltos y gestión de subrutinas.
A. Instrucciones de salto
Salvo la instruccion de salto incondicional, que sólo indica destino, tienen tres operandos.
Dos de ellos residen en memoria y son valores sobre los que se realiza una comparación -especificada
en el mnemónico- para determinar si el salto es o no efectivo. El tercer operando es la dirección
absoluta de destino. El salto se realiza, lógicamente, modificando el valor del contador de programa
(CP).Hay 5 instrucciones de este tipo, aunque dos son equivalentes:
- salta dest (ej. salta 16 CP = 16; instrucción de salto incondicional)
- salta> mem, mem, dest (ej. salta> d1, d2, 16 si d1 > d2 -> CP = 16)
- salta< mem, mem, dest (ej. salta< d1, d2, 16 si d1 < d2 -> CP = 16; como se ve, esta instrucción es
equivalente a la anterior sin más que invertir los registros)
- salta= mem, mem, dest (ej. salta= d1, d2, 16 si d1 = d2 -> CP = 16)
- salta>= mem, mem, dest (ej. salta>= d1, d2, 16 si d1 >= d2 -> CP = 16)
B. Instrucciones de gestión de subrutinas
Se trata de dos instrucciones que permiten relaizar la llamada y retorno de subrutinas. Se comentan por
separado.
- llama mem, dest (ej. llama d5, 42 d5 = CP instrucción siguiente, CP = 42)
La instrucción copia en la posición de memoria indicada la dirección de la instrucción siguiente, es
decir, la dirección de retorno. A continuación salta a la dirección destino.
- vuelve mem (ej. vuelve d5 CP = d5)
La instrucción permite volver a una dirección destino guardada en una posición de memoria mediante una
llamada a subrutina. Como en realidad se trata de un salto indirecto a memoria, permite también hacer
otras cosas interesantes como almacenar tablas de direcciones de funciones, etcétera.
3.4. Instrucciones de entrada/salida.
Se incluyen dos instrucciones básicas para trabajar con la E/S. En realidad sólo transfieren datos entre
los dispositivos externos -los disponibles en el simulador se describirán más adelante- y la memoria.
Son instrucciones con dos operandos, donde uno indica la
dirección del dispositivo y otro la ubicación del dato. Existen dos instrucciones de este tipo:
- sale mem, mem (ej. sale d0, d6 Envia el valor contenido en d6 al dispositivo cuya dirección se guarda en d0)
- entra mem, mem (ej. entra d6, d0 d6 = valor leido del dispositivo cuya dirección se guarda en d0)
3.5. Instrucciones de acceso indirecto.
Estas instrucciones permiten la transferencia de datos entre posiciones de memoria, con la particularidad de
que una de las direcciones se expresa mediante el modo indirecto a memoria. Esto permite trabajar con vectores,
matrices, punteros, etcétera. Son instrucciones de dos operandos, de las cuales existen dos:
- indlee mem, (mem) (ej. indlee d0, (d1) Si d1 contiene 8, d0 = d8)
- indesc (mem), mem (ej. indesc (d1), d0 Si d1 contiene 8, d8 = d0)
3.6. Instrucciones especiales y de control.
Aquí se agrupan todas las instrucciones que tienen influencia en el comportamiento del procesador. Hay tres
instrucciones en este grupo, que se describen a continuación.
El procesador básico, como todo procesador, está ejecutando instrucciones constantemente. La instrucción fin detiene
el funcionamiento del procesador, que no vuelve a ponerse en marcha hasta que es resetado.
Estra instrucciones permiten habilitar o deshabilitar las interrupciones en modo avanzado. En modo básico no hacen
nada.
4.GESTIÓN DE LAS EXCEPCIONES
En el modo avanzado se tratan tres excepciones vectorizadas, sin contar el reset que
tendría vector 0:
- División por cero (vector: 1)
- Interrupción de usuario (vector: 2)
- Interrupción periódica (vector: 3)
La primera excepción no es enmascarable, y es generada por las instrucciones divide y modulo.
Las otras dos (interrupciones externas) se habilitan y deshabilitan globalmente
mediante las instrucciones intsi e intno.
La interrupción de usuario se activa mediante el botón a tal efecto de la interfaz, mientras que la periódica
se activa cada cierto número de instrucciones, 23 en la versión actual.
El tratamiento de las excepciones es simple:
- Se deshabilitan las interrupciones.
- Se guarda el PC en d31.
- Se copia el vector correspondiente en el PC.
Las excepciones se verifican al acabar la cuarta fase de ejecución, y su prioridad
es Divpor0 > Usuario > temporizador.
No existe retorno de excepción; simplemente se debe utilizar el retorno de subrutina, con
d31 como fuente.
5. DISPOSITIVOS DE ENTRADA/SALIDA
Existen dos dispositivos de salida y uno de entrada. A continucación se describen:
5.1. Barra de LEDS
Ocupa la dirección 0 del mapa de E/S. El valor escrito, entre 0 y 255, se representa
en binario mediante los leds.
5.2. Display numérico
Ocupa las direcciones 1, 2 y 3 del mapa de E/S.
En la dirección 1 está el puerto de control, que sirve para seleccionar individualmente el
display de 7 segmentos activo (0, 1, 2 ó 3). Las escrituras posteriores a los puertos 2
ó 3 afectarán a este display.
En la dirección 2 tenemos el puerto de acceso a los segmentos. Al escribir un valor entre
0 y 127 se activarán los segmentos correspondientes a los 1 del valor en binario. El
segmento G es el de mayor peso, el A el de menor.
En la dirección 3 tenemos el puerto de acceso en hexadecimal. Al escribir un valor entre 0
y 15 aparecerá la cifra decimal correspondiente en el display.
5.3. Teclado hexadecimal
Ocupa el puerto 4 del mapa de E/S. Tal vez su funcionamiento cambie en el futuro para hacerlo más
real. De momento, al realizar una lectura del dispositivo se devuelve el valor hexadecimal de la última
tecla pulsada desde la lectura anterior (0 a 15), o 255 si no se ha pulsado ninguna.