Story Transcript
Soluciones de los ejercicios sobre Símplez+i4 1 1. Escriba los mismos contenidos en octal, y el código fuente en lenguaje ensamblador a partir del cual el ensamblador ha generado los contenidos de [0] a [3] Dirección
Contenido (hex.)
Contenido (oct.)
Código fuente
[0]
203
1003
LD .A, /3
[1]
642
3102
BR [/2]
[2]
004
0004
[3]
E00
7000
DATA 4 ; (o bien: ST .A, /4) HALT
2. •
¿Qué hace el programa al ejecutarse a partir de la dirección [0]? Pone repetidamente el valor H’E00 en la palabra de dirección [0]. En efecto, a partir de la dirección [4] y hasta la [4095] los contenidos se interpretan como ST .A, /0.
•
¿Cuándo termina? Cuando, tras ejecutar la ST .A,/0 que hay en [4095], el contador de programa se incrementa y resulta 0, con lo que se ejecuta lo que hay en [0], que ahora es la instrucción HALT.
•
¿Cuántas instrucciones se ejecutan? Todas las direcciones de memoria, salvo la [2] y la [3], y la [0] se ejecuta dos veces. Por tanto: 4.096-2+1=4.095 instrucciones.
•
¿Qué contenidos quedan en la memoria tras la ejecución? Sólo cambia el contenido de la dirección [0], que pasa de H’203 (LD .A,/3) a H’E00 (HALT).
1
Soluciones de los ejercicios sobre Símplez+i4
2 Se dan a continuación dos soluciones. Ambas suponen que el argumento “longitud” es mayor que cero y que las zonas no se solapan entre sí ni con las palabras ocupadas por el subprograma. Solución 1:
[7] [8] [9] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215]
ORG 7 0000 TEMP RES 1 ; para almacenamiento provisional 0321 PFIN DATA FIN ; puntero para bifurcar al final 0310 PBUC DATA BUC ; puntero para bifurcar al bucle ORG 200 6401 BUC SUB .X,#1 ; direcciones finales: (5)+(X)-1 y 4110 BZ [/PFIN] ; (6)+(X)-1 1305 LD .A, [/5][.X] 0007 ST .A, /TEMP 1306 LD .A, [/6][.X] 0305 ST .A, [/5][.X] 1007 LD .A, /TEMP 0306 ST .A, [/6][.X] 3111 BR [/PBUC] 1105 FIN LD .A, [/5] ; necesario para intercambiar las 0007 ST .A, /TEMP ; primeras (en el ultimo paso por 1106 LD .A, [/6] ; el bucle (X)=1) 0105 ST .A, [/5] 1007 LD .A, /TEMP 0106 ST .A, [/6] 0000 RET RES 1 ; o cualquier otra cosa
Solución 2:
[7] [8] [9] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212]
ORG 7 0000 TEMP RES 1 0327 PFIN DATA FIN 0316 PBUC DATA BUC ORG 200 1005 LD .A, /5 ; en esta solucion se decrementan 6001 SUB .A,#1 ; inicialmente los punteros, y no (X) 0005 ST .A, /5 1006 LD .A, /6 6001 SUB .A,#1 0006 ST .A, /6 1305 BUC LD .A, [/5][.X] 0007 ST .A, /TEMP 1306 LD .A, [/6][.X] 0305 ST .A, [/5][.X] 1007 LD .A, /TEMP 0306 ST .A, [/6][.X] 6401 SUB .X,#1
2
Soluciones de los ejercicios sobre Símplez+i4 [213] [214] [215]
4110 3111 0000 FIN
BZ BR RES
[/PFIN] [/PBUC] 1
3 Se sirve primero al teclado. Para invertir la prioridad basta con: •
Sustituir la instrucción LD .A,[/PETEC] de la dirección 4002 por LD .A,[/PEPAN]
•
Ponerle a la instrucción LD .X /XPAN la etiqueta RSTEC (y quitarla de donde está)
•
Intercambiar las secuencias [4005]-[4016] (servicio de la pantalla) y [4018]-[4029] (servicio del teclado)
•
Volver a ensamblar el programa
4 ORG 4000 ST .A,/AC ST .X,/X LD .A,[/PETEC] SUB .A,#3 BZ [/PRSTEC] LD .X,/XPAN BZ [/PBIFPAN] LD .A,[/PZPAN][.X] ST .A,[/PDPAN] ;;; INTRUCCIONES NUEVAS: SUB .A,#13 BZ [/PBIFPAN1] ;;; SUB .X,#1 ST .X,/XPAN BR [/PFIN] BIFPAN LD .A,#1 ST .A,[/PEPAN] ST .A,/MSPAN LD .A,[/PZPAN] ST .A,[/PDPAN] BR [/PFIN] ;;; INTRUCCIONES NUEVAS: BIFPAN1 LD .A,#1 ST .A,[/PEPAN]
; ; ; ; ; ; ; ; ;
Guarda (AC) Guarda (X) Mira si ha sido el teclado: en tal caso, debe tener los dos bits de su puerto de estado a "1" Si no ha sido el teclado, es la pantalla; si no es el último carácter, accede a la zona de datos, lo escribe
; si era "ret"... ; ; ; ; ; ; ; ;
y decrementa el índice Va al final Si es el último carácter, inhibe las interrupciones de pantalla, avisa al programa, escribe el carácter y va al final ; ;
Si el último escrito era "ret" inhibe las interrupciones de pantalla,
3
Soluciones de los ejercicios sobre Símplez+i4 ST BR
.A,/MSPAN [/PFIN]
;;; RSTEC
LD .X,/XTEC BZ [/PBIFTEC] LD .A,[/PDTEC] ST .A,[/PZTEC][.X] ;;; INTRUCCIONES NUEVAS: SUB .A,#13 BZ [/PBIFTEC1] ;;; SUB .X,#1 ST .X,/XTEC BR [/PFIN] BIFTEC LD .A,#1 ST .A,[/PETEC] ST .A,/MSTEC LD .A,[/PDTEC] ST .A,[/PZTEC] ;;; INTRUCCIONES NUEVAS: BR [/PFIN] BIFTEC1 LD .A,#1 ST .A,[/PETEC] ST .A,/MSTEC ;;; FIN LD .A,/AC LD .X,/X EI BR [/63] END
; ; ; ; ; ;
avisa al programa, y va al final
Caso del teclado: mira si es el último carácter Carga el carácter en el AC, lo lleva a la zona de datos
; si era "ret"... ;
; ; ; ; ;
y decrementa el índice
Si es el último carácter, inhibe las interrupciones de teclado, avisa al programa y lee el carácter
; Si no era "ret" va al final ; Si era "ret", inhibe ; las interrupciones de teclado ; y avisa al programa ; ; ; ;
Éstas son las operaciones finales: restaurar AC y X, permitir interrupciones y volver al programa
En la parte baja de la memoria habría que incluir dos nuevos punteros: PBIFPAN1 PBIFTEC1
DATA DATA
BIFPAN1 BIFTEC1
4
Soluciones de los ejercicios sobre Símplez+i4
5 Al terminar de ejecutar EI la UCP reconocería la interrupción y pondría en la dirección 63 el valor D’4033 (machacando la dirección de retorno al programa). Tras servir a la interrupción quedaría atrapada indefinidamente, ejecutando siempre la misma instrucción: BR [/63].
6 ORG ST ST LD SUB BZ LD ... ... ST BR RSREL LD LD SUB BZ LD ADD ST BR PACSEG LD ST LD SUB BZ LD ADD ST BR PACMIN LD ST LD ADD ST FIN LD LD EI BR END
4000 .A,/AC .X,/X .A,[/PEREL] .A,#3 [/PRSREL] .A,[/PETEC]
.A,[/PZTEC] [/PFIN] .A,[/PDREL] .A,/SEG .A,#59 [/PPACSEG] .A,#1 .A,/SEG .A,/SEG [/PFIN] .A,#0 .A,/SEG .A,/MIN .A,#59 [/PPACMIN] .A,#1 .A,/MIN .A,/MIN [/PFIN] .A,#0 .A,/MIN .A,#1 .A,/HOR .A,/HOR .A,/AC .X,/X [/63]
; ; ; ; ; ; ;
Guarda (AC) Guarda (X) Mira si ha sido el reloj. En el programa de iniciación, PEREL DATA 4090, PDREL DATA y PRSREL DATA RSREL A partir de aquí, servicio del teclado y la pantalla, igual que en el programa anterior
; ; ; ; ; ; ;
Fin de la RS del teclado Salida. A continuación, RS del reloj Pone 0 en "preparado" En el programa de iniciación, SEG DATA 0, MIN HOR DATA 0 y PPACSEG DATA PACSEG Caso de SEG < 59
;
Incrementado SEG, salir:
;
Caso de SEG = 59
; ;
En el programa de iniciación, PPACMIN Caso de MIN < 59
;
Incrementado MIN, salir:
;
Caso de MIN = 59
; ; ; ; ;
Incrementado HOR, salir: Éstas son las operaciones finales: restaurar AC y X, permitir interrupciones y volver al programa
DATA
4091
DATA
PACMIN
5
0
Soluciones de los ejercicios sobre Símplez+i4
7 Solución 1: Inicialmente el programa analiza la situación, dependiendo de los valores que tengan Z (con la instrucción BZ), (AC) y (X), y pone a “0” o a “1” una variable booleana local, AX, según que a la salida se deba restaurar el último AC o X, respectivamente. Z
AC
X
Valor de AX
1
0
0
indiferente
1
0
distinto de 0
AX = 0
1
distinto de 0
0
AX = 1
1
distinto de 0
distinto de 0
imposible
0
0
0
imposible
0
0
distinto de 0
AX = 1
0
distinto de 0
0
AX = 0
0
distinto de 0
distinto de 0
indiferente
Una solución es la que indica el siguiente seudocódigo: /* inmediatamente después de [4001] (recordar que la instrucción ST no afecta a Z) */ si Z == 1 entonces /* implementación: con BZ */ si AC == 0 entonces /* implementación: con SUB .A,#0 y BZ */ AX = 0 si no, AX = 1 si no, si AC == 0 entonces AX = 1 si no, AX = 0 /* operaciones de consulta y servicio */ ... /* al final, en sustitución de [4030] y ss.: */ si AX == 0 entonces LD .X,/X, LD .A,/AC si no LD .A,/AC, LD .X,/X EI BR [/63]
Hay otras tres soluciones equivalentes siguiendo esta misma idea de calcular al principio la variable AX. En efecto, si consideramos “AC” y “X” como variables booleanas (“distinto de 0” sería el valor “1”) y aplicamos, por ejemplo, el método de Karnaugh para minimizar AX = f(Z, AC, X), encontramos cuatro fórmulas:
6
Soluciones de los ejercicios sobre Símplez+i4 •
AX = Z·AC + ~Z·~AC
•
AX = Z·~X + ~Z·X
•
AX = Z·AC + ~Z·X
•
AX = Z·~X + ~Z·~AC
(Donde “~Z”, “~AC” y “~X” significan “no Z”, “no AC” y “no X”) El seudocódigo propuesto corresponde a la primera fórmula. A partir de él, o de cualquiera de los correspondientes a las otras fórmulas, es inmediata la codificación del programa en ensamblador. Pero hay otras soluciones más económicas en número de instrucciones. Solución 2: Podemos prescindir del cálculo de AX al principio y en su lugar guardar el valor de Z en ZM. Al terminar, restaurar AC y X como en el programa original. Si el último restaurado ha sido X, el valor de Z será “0” si X es distinto de cero y “1” si X es igual a cero. La segunda de las fórmulas (AX = Z·~X + ~Z·X) se puede escribir así: AX = ZM·Z + ~ZM·~Z; Si el resultado de ZM·Z + ~ZM·~Z es “1” (cosa que ocurre cuando Z = ZM) es que hemos hecho bien en restaurar X después de AC, y si no es así repetimos la operación de restaurar AC para que sea la última. Es decir: /* inmediatamente después de [4001] */ si Z == 1 entonces ZM = 1, si no ZM = 0 /* operaciones de consulta y servicio */ ... /* al final, en sustitución de [4030] y ss.: */ si ZM == 0 entonces LD .A,/AC, LD .X,/X si Z == 1 entonces LD .A,/AC si no LD .A,/AC, LD .X,/X si Z == 0 entonces LD .A,/AC EI BR [/63]
Notas: •
Podría pensarse en hacer LD .A,/AC y LD .X,/X antes de la consulta sobre ZM, pero no es posible, porque luego se perderían los valores restaurados de AC y X.
7
Soluciones de los ejercicios sobre Símplez+i4 •
Otra posibilidad es restaurar primero X y luego AC y aplicar la fórmula AX = Z·AC + ~Z·~AC
La implementación en ensamblador sería:
PZ PSIGUE PZM0 PLDA PSAL ZM
Z SIGUE ; ; ; ;
LDA SAL ZM0
ORG DATA DATA DATA DATA DATA RES
57 Z SIGUE ZM0 LDA SAL 1
ORG 4000 ST .A,/AC ST .X,/X BZ [/PZ] LD .A,#0 ST .A,/ZM BR [/PSIGUE] LD .A,#1 ; Z=1: hay que terminar restaurando ST .A,/ZM ; el registro que contenga 0 ... consulta y servicio ... ... al final: LD BZ LD LD BZ LD EI BR LD LD BZ BR
.A,/ZM [/PZM0] .A,/AC .X,/X [/PSAL] ; ZM=1, Z=1: OK, salir .A,/AC ; ZM=1, Z=0: restaurar AC [/63] .A,/AC .X,/X [/PLDA] [/PSAL]
; ZM=0, Z=1: restaurar AC ; ZM=0, Z=0: OK, salir
8 a. Como dispone de direccionamiento indirecto, la capacidad de direccionamiento está determinada por la longitud de palabra: 216 = 65.536 palabras de 16 bits, es decir, 65.536×2 = 131.072 bytes (128 KB). Como a cada puerto de periférico se le asigna una dirección de memoria, el número de palabras que quedan para la MP son: 65.536 - 2×4 = 65.528.
8
Soluciones de los ejercicios sobre Símplez+i4 b. Modificaciones sobre el modelo procesal de Símplez: •
En la transición de I1 a I0: añadir INC, SET y BRA.
•
En la transición de I1 a O0: añadir SUB.
•
Añadir dos estados, II0 e II1, para el ciclo de indirección.
•
Transición de I1 a II0 etiquetada con LDI y STI.
•
Transiciones de II0 a II1 y de II1 a O0.
c. (sí/no) STI
LDI
sí
sí
nombre funcionalidad
componente Registro de 16 bits, RD, entre los buses D y Ai, con puerta triestado de salida. (Ver nota más abajo)
erd
Carga los valores del bus D en un registro de direcciones, RD
srd
Saca el contenido de RD al bus Ai
erd
(lo mismo)
(lo mismo)
srd SUB
sí
sub
Resta entradas de la UAL
UAL
BRA
sí
saa
Activa una puerta triestado que pone los 12 bits menos significativos del AC en el bus Ai
Puerta triestado entre AC y bus Ai
SET
sí
set
Pone a 1 la salida de la UAL
UAL
INCR
sí
inc
Incrementa el contenido del acumulador (o bien incrementa la entrada 2 de la UAL)
Acumulador (o bien UAL)
d. Otras modificaciones necesarias en la ruta de datos de Símplez: •
Bus D, registros RI y AC con 16 bits (= longitud de palabra).
•
Buses Ai y A, registros CP y RA con 16 bits (= longitud de dirección) (los 4 bits más significativos de Ai deben ponerse a 0 cuando se depositen en este bus los contenidos de AC y CD).
•
Más líneas en el bus de control y cuatro controladores de periféricos.
Notas: •
En principio, se podría prescindir del registro RD, conectando los buses D y Ai mediante unas puertas triestado que se activasen durante el ciclo de indirección. En este caso, durante este ciclo de indirección (II0, II1) habría que mantener la señal lec para que los datos estuviesen estables en el bus D, y, por tanto, en el Ai, durante todo el ciclo (esto es así porque la entrada de la dirección en el registro RA se produce en el flanco de subida de II1).
9
Soluciones de los ejercicios sobre Símplez+i4 •
Otra solución es reutilizar RI para que haga esta función de registro intermedio. Conectaríamos sus dieciséis bits con el bus Ai a través de puertas triestado, y para la transferencia (RI) → bus Ai usaríamos dos microórdenes distintas: una para transferir los dieciséis bits (para el caso de indirección), y otra para transferir los doce menos significativos, poniendo a cero los otros cuatro. Esta solución valdría para este caso, pero no, por ejemplo, para el caso de Símplez+i3 del ejercicio siguiente.
9
10
Soluciones de los ejercicios sobre Símplez+i4
10
Se puede comprobar que el modelo satisface la condición de que el efecto de la instrucción EI sea retardado (ejercicio 5).
• Padre: Materiales didácticos • Inicial: Fundamentos de ordenadores
11