|
|
| Duración: | 3 horas |
| Puntuación: | 80 puntos (sobre 100) |
| Fecha: | 22 de septiembre de 2005 |
| Nota: | Se podrán usar libros, apuntes y calculadora. |
El Sudoku es un puzzle de números basado en una matriz de 9x9. La única regla para su solución es que en cada fila, cada columna y cada uno de los 9 cuadrados de 3x3 sólo pueden aparecer las cifras del 1 al 9 una sola vez. La siguiente figura muestra un ejemplo de Sudoku ya resuelto.

Se puede comprobar que cada fila, columna y cuadrado de 3x3 incluye los dígitos del 1 al 9 sin repetición. En el programa que comprueba la solución del puzzle la matriz de números enteros está almacenada por filas. Se necesitan implementar las siguientes subrutinas en ensamblador:
(20 puntos) Rutina compruebaFila: Recibe como parámetros a
través de la pila en posiciones ascendentes de
memoria la dirección de comienzo de una fila de la solución
y la dirección de comienzo de una tabla de 9 enteros inicialmente a
cero. La rutina devuelve a través de la pila el entero 1 si la fila
cumple el requisito de la
solución, un 0 si no lo cumple, y un -1 si tiene valores incorrectos
(menor que 1 o mayor que 9). La siguiente figura muestra cómo se
almacenan los parámetros y el espacio para el resultado en la pila
justo antes de la llamada a esta subrutina.

La tabla de 9 enteros inicializados a cero se puede utilizar y modificar sus valores para comprobar las veces que aparece cada dígito. La solución debe realizar la comprobación utilizando un bucle.
Además, se ha implementado previamente la rutina todoIgual
que recibe como parámetro la dirección de una tabla con nueve enteros y
devuelve a través del registro %eax el valor 1 si todos
los elementos de la tabla son idénticos y 0 en caso contrario. La
rutina compruebaFila puede contar las apariciones de cada
dígito utilizando la tabla auxiliar y utilizar esta función para
comprobar que todos aparecen el mismo número de veces. La solución debe
realizar la comprobación utilizando un bucle.
(20 puntos) Rutina compruebaCuadrado: Recibe como
parámetros la dirección del número que está en la esquina superior
izquierda del cuadrado y la dirección de una tabla de 9 enteros todos
ellos inicializados a cero. Devuelve en el registro
%eax el valor 1 si el cuadrado es correcto y cero en caso
contrario. No realiza ninguna otra comprobación de los valores
numéricos de la solución. La siguiente figura ilustra cómo están
almacenados los parámetros en la pila con respecto a un cuadrado de 3x3 enteros.

PROBLEMA 2 (40 puntos)
En hoja aparte se presenta la ruta de datos de SímplezSep05. Los cambios introducidos respecto de Símplez original son los siguientes:
El bus A, el bus Ai, el bus D, todos los registros (salvo CO), todas las puertas triestado y la UAL son de 16 bits (la UAL puede realizar cálculos con operandos de 8 y 16 bits).
La Memoria Principal tendrá direcciones de 16 bits y palabras de 8 bits. Sin embargo, se permitirá acceder a 2 palabras de Memoria Principal consecutivas en un sólo acceso. Es decir, las lecturas y escrituras de esta Memoria Principal podrán ser de 8 o de 16 bits. Se utiliza un esquema "little endian", y por lo tanto, en un acceso de 16 bits a la dirección d de Memoria Principal se accede a las palabras de dirección d (8 bits menos significativos) y d+1 (8 bits más significativos).
Cuando se lee o escribe un dato de 8 bits en Memoria Principal, este dato se deposita o se toma de los 8 bits menos significativos del bus D. Cuando se escribe en una palabra de Memoria Principal (8 bits), el valor de los 8 bits más significativos del bus D se ignora.
Para indicar si estamos realizando operaciones con 8 o 16 bits se duplican las microórdenes de control de la Memoria Principal respecto de las de Símplez original, de forma que dichas microórdenes son las siguientes: lec8 para leer 8 bits, lec para leer 16 bits, esc8 para escribir 8 bits y esc para escribir 16 bits. La temporización de la Memoria Principal es idéntica a la de Símplez.
Se utiliza la microorden m8b para indicar si la UAL está operando con datos de 8 o 16 bits. Cuando m8b está activa, la UAL opera con datos de 8 bits. En ese caso, los operandos se toman de los 8 bits menos significativos de AC y de los 8 bits menos significativos del bus D y el resultado se deposita en los 8 bits menos significativos de la entrada de AC. Los 8 bits más significativos de la entrada de AC se ponen a 0.
El registro CO, de 8 bits, se utiliza para almacenar el código de operación de una instrucción, que se encuentra siempre en los 8 bits menos significativos de dicha instrucción. Dispone de una entrada de carga llamada eco.
El registro CD se utilizada para guardar los 16 bits más significativos de aquellas instrucciones que ocupan 3 bytes. Dispone de una entrada de carga llamada ecd. Asimismo, el dato guardado en CD se puede llevar al bus Ai a través de una puerta triestado controlada por la microorden sri.
El registro PP hace las funciones de puntero de pila. Dispone de una entrada de carga, llamada epp, de una entrada de incremento (incrementa una unidad), llamada incpp y de una entrada de decremento (decrementa una unidad), llamada decpp. El dato guardado en PP se puede llevar al bus Ai a través de una puerta triestado controlada por una microorden llamada spp. Para introducir un dato en la pila se decrementa el puntero de pila, mientras que al extraer un dato de la pila se incrementa el puntero de pila.
Las instrucciones pueden ocupar 1 o 3 bytes, dependiendo del código de operación que se indica en el primer byte.
El formato de instrucción es el ilustrado en la figura que se presenta a continuación:

Se pide:
(30 puntos) Escriba para cada una de las instrucciones que se describen a continuación, un cronograma que las implemente:
Instrucción PUSH8: introduce en la pila los 8 bits menos significativos del dato contenido en AC.
Instrucción PUSH16: introduce en la pila el dato contenido en AC (16 bits).
Instrucción POP8: extrae un dato de 8 bits de la pila y lo guarda en AC.
Instrucción POP16: extrae un dato de 16 bits de la pila y lo guarda en AC.
Estas 4 instrucciones ocupan una única palabra de Memoria Principal (8 bits).
(10 puntos) Se desea también implementar la instrucción PUSHI, que ocupa 24 bits. Esta instrucción introduce en la pila un operando inmediato, que se encuentra en los 16 bits más significativos de la instrucción. Para poder implementar la instrucción PUSHI es necesario modificar la ruta de datos de SímplezSep05. Modifique la ruta de datos de SímplezSep05, de forma que se pueda implementar la instrucción PUSHI y las 4 instrucciones mencionadas en el primer apartado y escriba un cronograma que implemente la instrucción PUSHI en la nueva ruta de datos.