![]() |
|
Duración: | 1 hora 45 minutos |
Puntuación: | 6.8 puntos (sobre 10) |
Fecha: | 27 de junio de 2001 |
Nota: | Se podrán usar libros y apuntes. |
En el siguiente programa (realizado en ensamblador de Algorítmez):
org 0 ld .1, #200 ld .2, #150 ld .3, #100 ld .14, #0 st.b .1, /60000 st.b .2, /50000 st.b .3, /40000 call subruti ld.b .1, /60000 ld.b .2, /50000 ld.b .3, /40000 halt
subruti ld .1, #3000 ld .2, #H'7070 bucle sub .1, #1 bz /fin push .2 br bucle fin ld .2, #3000 bucle2 sub .2, #1 bz /fin2 pop .3 br bucle2 fin2 clr .1 clr .2 clr .3 ret end
Solución:
El programa comienza salvando el contenido de los registros que va a emplear la subrutina. A continuación, llama a "subruti", que se dedica a introducir en la pila 3000 palabras iguales y a volverlas a extraer, tras lo cual limpia los registros que ha empleado y retorna. Tras regresar de la subrutina, el programa recupera el valor "original" de los registros y termina.
R1: 70'H (112'D)
R2: 150'D
R3: 100'D
R14: 0'D
R1 no recupera su valor original porque éste ha
sido machacado por la pila.
Necesitamos un programa que calcule el valor absoluto de la diferencia entre los sumatorios de números pares e impares de un array. Para ello, tenemos ya escrito el siguiente pseudocódigo que soluciona el problema:
pares = 0 impares = 0 for (i=0; i < N; i++) { if (VEC[i] & H'0001) { impares += VEC[i] } else { pares += VEC[i] } } if (pares > impares) { dif = pares - impares } else { dif = impares - pares }Deberá escribirse una versión en ensamblador de este programa, que comience en la dirección 0 de memoria y que termine con una instrucción HALT. Al final del mismo, tendremos las siguientes pseudoinstrucciones.
N EQU 50 ; tamaño del array ORG 1000 VEC DATA ... ; el array VEC, de tamaño N, que abarca desde VEC[0] a VEC[N-1] AUX RES 1 ; palabra auxiliar para operaciones temporales (pueden haber más)En ellas se define a N como una constante que indica el tamaño del array (en palabras de 16 bits) y se define VEC como un array de tamaño N que se posiciona a partir de la dirección 1000 y cuyos elementos están almacenados consecutivamente dentro del array. Podemos suponer que el array estará cargado en memoria en el momento de la ejecución. Para operaciones temporales, disponemos también de una palabra en la dirección AUX, aunque en caso necesario podemos definir más palabras temporales justo a continuación si se considera conveniente.
A la hora de escribir la versión en ensamblador del programa, deberá seguirse la siguiente correspondencia entre las variables del pseudocódigo y los registros del programa en ensamblador.
.0 = i, .1 = pares, .2 = impares, .3 = dif. El resto de los (.4 ... .13) pueden usarse para lo que se quiera.
No hace falta salvaguardar los registros. Al final de la ejecución, .3 debe contener el resultado de la variable dif, .2 debe contener impares y .1 debe contener pares.
Solución:
ORG 0 LD .1, #0 ; pares = 0 LD .2, #0 ; impares = 0 LD .0, #0 ; i = 0 BUCLE CMP .0, #D'100 ; (i >= N)? (2 bytes) BNN FINBUC LD .4, /VEC[.0] AND .4, #0001 ; (VEC[i] par?) BZ ELSE1 ADD .2,/VEC[.0] ; (impares += VEC[i]) BR FINIF1 ELSE1 ADD .1,/VEC[.0] ; (pares += VEC[i]) FINIF1 ADD .0, #2 ; i++ (2 bytes) BR BUCLE FINBUC ST .1, /AUX CMP .2, /AUX ; (impares >= pares)? BNN ELSE2 PUSH .1 POP .3 ; dif = pares ST .2, /AUX SUB .3, /AUX ; dif = pares - impares BR FIN ELSE2 PUSH .2 POP .3 ; dif = impares ST .1, /AUX ; opcional, no hace falta SUB .3, /AUX ; dif = impares - pares FIN HALT N EQU 50 ORG 1000 VEC DATA N AUX DATA 1 END
Se desea diseñar un secuenciador microprogramado para cierto ordenador. Las características del secuenciador a diseñar son las siguientes:
Nota: para el diseño del secuenciador puede utilizar exclusivamente los siguientes componentes:
Dado que las características del secuenciador a diseñar definidas en los puntos 1 al 7 del enunciado coinciden con las del secuenciador microprogramado de Símplez, parece razonable partir de dicho secuenciador, y estudiar que modificaciones son necesarias para cumplir con los puntos 8 al 12.
El punto 8 me dice que la Memoria de Control (MC) ha de tener 64 palabras. Como sabemos, las microinstrucciones tienen un campo (DS) en el que se indica la dirección de la siguiente microinstrucción a leer. Como quiera que las primeras 8 microinstrucciones serán las leídas al comienzo de la ejecución de las instrucciones, según lo dicho en los puntos 4 y 5, el campo DS ha de poder direccionar las palabras de la dirección 8 a la 63 de MC (56 palabras) . Por lo tanto, para especificar la dirección de la siguiente microinstrucción necesitamos 6 bits (con 5 bits sólo se podrían direccionar 32 palabras).
Con 6 bits podemos identificar directamente la dirección de la siguiente microinstrucción (en vez de solamente los bits menos significativos, como se hacía en Símplez). Por lo tanto, vamos a simplificar el cálculo de DMC. Si sco=0, DMC lo tomaremos directamente de DS (salvo lo explicado más adelante para los puntos 10, 11 y 12) y si sco=1, DMC será el código de operación de la nueva instrucción a ejecutar.
Para implementar el cálculo de DMC (figura 3), basta un multiplexor con 2 entradas de 6 bits cada una, controlado por la microorden sco. Los 3 bits menos significativos de la entrada 1 se tomarán de los bits del bus de datos por los que circula el código de operación de las instrucciones y se completan los 3 bits más significativos con ceros. La entrada 0 se tomará directamente de DS (salvo lo explicado más adelante para los puntos 10, 11 y 12).
El punto 10 simplemente nos informa de la existencia de
dos indicadores. Los puntos 11 y 12 me indican que esos indicadores influyen
en la dirección de la siguiente microinstrucción de dos microinstrucciones.
Vamos a aprovechar que las posibles direcciones siguientes en los dos casos
sólo se diferencian en el bit menos significativo. Vamos a definir
el valor del campo DS para esas dos microinstrucciones como un 0 para el
bit menos significativo y los bits más significativos serán
los correspondientes a la dirección de la siguiente microinstrucción,
que, como se ha dicho, son independientes del valor del indicador. Un bloque
de circuitería se encargará de poner a 1 el bit menos significativo
de DS cuando sea necesario. Por lo tanto, el campo DS vale 30 para la microinstrucción
de dirección 25 y 40 para la de dirección 35.
figura 1: diseño del secuenciador microprogramado
Vamos a definir un bloque de circuitería (figura 2) que colocaremos entre la salida DS de MC y la entrada 0 del multiplexor indicado anteriormente. La salida de ese bloque la llamaremos DSE (DS efectiva). Este bloque no modifica los bits 1 al 5 de DS. Para el bit 0 de DSE lo tomaremos de una puerta OR con tres entradas. Una de ellas es DS0. Las otras 2 vienen de dos puertas AND. Una de ellas se encarga de poner el bit menos significativo de DSE a 1 cuando se está leyendo la microinstrucción de dirección 25 y (Z)=1. La otra se encarga de poner el bit menos significativo de DSE a 1 cuando se está leyendo la microinstrucción de dirección 35 y (V)=0.Tienen dos entradas; una de ellas es una microorden interna al secuenciador. La microorden bbz solamente vale 1 para la palabra de MC de dirección 25. La microorden bbv solamente vale 1 para la palabra de MC de dirección 35. De esta forma, se garantiza que para todas las demás palabras de MC la salida de las puertas AND es 0, por lo que el bit menos significativo de DSE coincide con el bit menos significativo de DS.
Finalmente, el punto 9 nos dice que la ruta de datos se
controla por medio de 20 microinstrucciones. Por lo tanto, las palabras
de MC son de 30 bits: 24 corresponden a las microinstrucciones (20
de la ruta de datos más 4 internas al secuenciador: sco,
cbf,
bbz,
bbv)
y 6 de campo DS. El diseño completo se presenta en la figura 1.
figura 2: detalle del bloque (1) de la figura 1
Terminado el diseño, podemos contestar a todas las preguntas que se plantean en el enunciado:
figura 3: detalle del bloque (2) de la figura 1
4º PROBLEMA (1.8 puntos)
La figura 1 muestra la ruta de datos de Símplez*. Los cambios introducidos respecto a Símplez son los siguientes:
Conteste a las siguientes preguntas:
Las ideas básicas que hay que considerar para resolver este problema son las siguientes:
PREGUNTA 1
DMC | CuO | DS |
x1 | sac, sum, eac | ds1 |
ds1 + 8 | sac, sum, eac, scp, era | dfinal |
dfinal + 8 | lec, eri, incp, sco |
PREGUNTA 2
DMC | CuO | DS |
x2 | sac, sum, eac, eau | ds2 |
ds2 + 8 | sac, sum, eac | ds2 + 1 |
ds2 + 1 + 8 | rs, sac, sum, eau | ds2 + 2 |
ds2 + 2 + 8 | sac, sum, eac | ds2 + 3 |
ds2 + 3 + 8 | rs, sac, sum, eac, scp, era | dfinal |
dfinal + 8 | lec, eri, incp, sco |
PREGUNTA 3
DMC | CuO | DS |
x3 | sri, era | ds3 |
ds3 + 8 | rs, sac, esc | ds3 + 1 |
ds3 + 1 + 8 | rs, sac | ds3 + 2 |
ds3 + 2 + 8 | sac, sum, eac, eau | ds3 + 3 |
ds3 + 3 + 8 | sac, sum, eac | ds3 + 4 |
ds3 + 4 + 8 | rs, sac, sum, eau | ds3 + 5 |
ds3 + 5 + 8 | sac, sum, eac | ds3 + 6 |
ds3 + 6 + 8 | rs, sac, sum, eac | ds3 + 7 |
ds3 + 7 + 8 | lec, tra2, eau | ds3 + 8 |
ds3 + 8 + 8 | scp, era | dfinal |
dfinal + 8 | lec, eri, incp, sco |