UC3M
Fundamentos de Ordenadores II - Examen Septiembre 05
Ingeniero de Telecomunicación
 
Depto. de Ingeniería Telemática 
Universidad Carlos III de Madrid

 2ª Parte: Problemas

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. 


Requisitos para aprobar el examen:
  1. Nota en el examen >= 50 puntos
  2. Nota del problema 1 >= 12 puntos
  3. Nota del problema 2 + nota del problema 3 >= 12 puntos

PARTE 1: NIVEL DE MÁQUINA CONVENCIONAL

PROBLEMA 1(40 puntos)

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:

  1. (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.


  2. (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.

PARTE 2: FUNCIONAMIENTO INTERNO DEL ORDENADOR

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:

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:

  1. (30 puntos) Escriba para cada una de las instrucciones que se describen a continuación, un cronograma que las implemente:

    1. Instrucción PUSH8: introduce en la pila los 8 bits menos significativos del dato contenido en AC.

    2. Instrucción PUSH16: introduce en la pila el dato contenido en AC (16 bits).

    3. Instrucción POP8: extrae un dato de 8 bits de la pila y lo guarda en AC.

    4. 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).

  2. (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.