![]() |
|
Duración: | 3 horas 30 minutos |
Puntuación: | 7.6 puntos (sobre 10) |
Fecha: | 26 de junio de 2002 |
Nota: | Se podrán usar libros y apuntes. |
|
call printf
addl $12, %esp
cmpl $3, x
jz fin
movl x, %eax
incl %eax
movl y, %ebx
addl $fila1, %eax
movb (%eax, %ebx, 4), %cl
cmpb $1, %cl
jz obstaculoEste
incl xjmp bucle obstaculoEste:
pushl %eax
pushl $mensaje2
call printf
addl $4, %esp
popl %eax decl %eax incl %ebx movb (%eax, %ebx, 4), %cl cmpb $1, %cl jz obstaculoSur movl %ebx, y jmp bucle obstaculoSur:
pushl $mensaje3
call printf
addl $4, %esp
fin:
popl %ecx
popl %ebx popl %eax movl %ebp,%esp
popl %ebp
ret
|
a) Escribir la secuencia de mensajes que aparecen en pantalla durante la ejecución del programa. (1.3 puntos)
Solución:(0,0) (1,0) Obstáculo al este (1,1) (2,1) (3,1)b) Suponiendo que este programa implemente un algoritmo para salir del laberinto descrito por las etiquetas fila1, fila2, fila3, fila 4 y fila 5 (donde los unos indican las casillas que son pared), ¿qué cero cambiarías por un uno para que siguiese habiendo un camino hasta la salida, pero de forma que el algoritmo no fuese capaz de encontrarlo? (La entrada al laberinto es la casilla (0,0), y llegar a la salida significa alcanzar una posición libre en la cuarta columna). Escribir la secuencia de mensajes que escribiría el programa en ese caso. (0.4 puntos)
Solución:Dos casos posibles:
(0,0) (1,0) Obstáculo al este (1,1) Obstáculo al este (1,2) Obstáculo al este Obstáculo al sur
(0,0) (1,0) Obstáculo al este (1,1) (2,1) Obstáculo al este Obstáculo al sur
2o PROBLEMA (2.7 puntos)
Se dispone de un programa que manipula el nombre y los apellidos de un conjunto de usuarios. Para ello se manipulan dos tablas que comienzan en las posiciones de memoria con etiquetas nombres y apellidos y que contienen las direcciones donde comienzan el nombre y los apellidos del usuario respectivamente. El tamaño de estas tablas es idéntico y está almacenado en un número de 32 bits en una posición de memoria con etiqueta tamaño. Este tamaño es distinto de cero.
Se pide escribir los siguientes fragmentos de código documentando detalladamente la solución propuesta:
Solución
cuenta: push %ebp mov %esp, %ebp push %ebx push %ecx mov $0, %eax mov 8(%ebp), %ebx mov 12(%ebp), %ecx mov (%ecx, %ebx, 4), %ebx cond: cmpb $0, (%ebx, %eax) jz done inc %eax jmp cond done: pop %ecx pop %ebx mov %ebp, %esp pop %ebp ret
Solución
suma: push %ebp mov %esp, %ebp push %eax push %ebx push %ecx mov $0, %ebx mov tamaño, %ecx cond: dec %ecx jn done push $nombre, push %ecx call cuenta add %eax, %ebx mov $apellidos, 4(%esp) call cuenta add %eax, %ebx add $8, %esp jmp cond done: mov %ebx, 8(%ebp) pop %ecx pop %ebx pop %eax mov %ebp, %esp pop %ebp ret
Solución
La observación clave a realizar es que cambiar los strings de posición tan solo requiere intercambiar las direcciones en las tablas. No es necesario mover los strings de un lugar a otro de memoria.
swap: push %ebp /* Guardar y asignar ebp */ mov %esp, %ebp push %eax push %ebx push %ecx push %edx mov 8(%ebp), %eax /* Almacena el indice i en eax */ mov 12(%ebp), %ebx /* Almacena el indice j en ebx */ mov nombre(, %eax, 4), %ecx /* Mover el primer nombre a ecx */ mov nombre(, %ebx, 4), %edx /* Mover el segundo nombre a edx */ mov %ecx, nombre(, %ebx, 4) /* Mover %ecx a la posicion j */ mov %edx, nombre(, %eax, 4) /* Mover %edx a la posicion i */ mov apellidos(, %eax, 4), %ecx /* Mover el primer apellido a ecx */ mov apellidos(, %ebx, 4), %edx /* Mover el segundo apellido a edx */ mov %ecx, apellidos(, %ebx, 4) /* Mover %ecx a la posicion j */ mov %edx, apellidos(, %eax, 4) /* Mover %edx a la posicion i */ pop %edx pop %ecx pop %ebx pop %eax mov %ebp, %esp pop %ebp /* Restaurar EBP */ ret
Se desea modificar el comportamiento de la instrucción
ADD de Símplez. El comportamiento que se desea que tenga esta nueva
versión es el siguiente. Suma dos palabras de MP, dejando el resultado
en el acumulador. Para poder indicar las direcciones de las dos palabras
de MP que se desea sumar, la instrucción ADD se codifica ahora por
medio de dos palabras consecutivas de MP. La primera tiene en los tres bits
más significativos el código de operación (010) y en
los 9 bits restantes la dirección de la primera palabra de MP que
se desea sumar. Los tres bits más significativos de la segunda palabra
de la instrucción valen 000. Los 9 bits menos significativos de la
segunda palabra de la instrucción contienen la dirección de
la segunda palabra de MP a sumar. La ruta de datos no cambia.
Se pide:
Solución:
APARTADO 1
El microprograma a realizar esencialmente consiste en el microprograma de la instrucción LD seguido del microprograma de la instrucción ADD.
Dir. MC | Microórdenes | DS |
x | sri, era | d |
d+8 | lec, tra2, eac | d+1 |
d+9 | scp, era | d+2 |
d+10 | lec, eri, incp | d+3 |
d+11 | sri, era |
d+4 |
d+12 | lec, sum, eac | d+5 |
d+13 | scp, era | dfinal |
dfinal+8 | lec, eri, incp, sco |
APARTADO 2
Si sería posible realizar el secuenciador cableado en las condiciones indicadas. Recuérdese que los circuitos combinacionales que generan las microórdenes toman como entradas el código de operación de la instrucción, el estado de ejecución y el biestable Z. Estas informaciones estarían disponibles, salvo en el caso de la nueva instrucción ADD, en la cuál a partir del sexto ciclo de reloj (inmediatamente después del ciclo de reloj en el que se lee la microinstrucción de dirección d+10) el código de operación desaparece, ya que la nueva lectura de MP escribe 000 en CO. Pero como no hay ninguna otra instrucción con más de 4 ciclos de reloj, una vez superado el quinto ciclo sabemos que se trata de la instrucción ADD aunque haya 000 en CO.
4º PROBLEMA (2 puntos)
Se desea diseñar una versión de Símplez, que llamaremos Símplez-SIMD, en la que se modifica el repertorio de instrucciones de Símplez, añadiendo tres instrucciones SIMD (Single Instruction Multiple Data). Las instrucciones SIMD se caracterizan porque la ejecución de una única instrucción se realiza sobre varios datos. En nuestro caso, se sustituye el registro AC de Símplez por 16 registros de próposito general de 16 bits (identificados por R[0] a R[15]), encapsulados en una Memoria Local, que llamaremos ML. Las nuevas instrucciones STS, LDS y ADDS, que sustituyen a ST, LD y ADD realizan operaciones sobre 1 a 16 datos de 16 bits. La nueva Memoria Principal, MP, tiene una capacidad de 65536 palabras de 16 bits, es decir, utiliza direcciones y datos de 16 bits. Por lo tanto, tanto el bus de direcciones como el bus de datos son de 16 bits.
Concretamente la funcionalidad y la sintaxis en ensamblador de las instrucciones STS, LDS y ADDS es la siguiente:
- Instrucción
STS(m) .n, /p. Copia el contenido del registro R[n] en la palabra
de MP de dirección p; copia el contenido del registro R[n+1] en
la palabra de MP de dirección p+1; ...;copia el contenido del registro
R[n+m-1] en la palabra de MP de dirección p+m-1. Por ejemplo la
instrucción:
STS(4) .3, /67copia el contenido del registro R[3] en la palabra de MP de dirección 67; copia el contenido del registro R[4 ]en la palabra de MP de dirección 68; copia el contenido del registro R[5] en la palabra de MP de dirección 69 y copia el contenido del registro R[6] en la palabra de MP de dirección 70.
- Instrucción
LDS(m) .n, /p. Copia el contenido de la palabra de MP de dirección
p en el registro R[n]; copia el contenido de la palabra de MP de dirección
p+1 en el registro R[n+1]; ...; copia el contenido de la palabra de MP de
dirección p+m-1 en el registro R[n+m-1]. Por ejemplo la instrucción:
LDS(4) .3, /67copia el contenido de la palabra de MP de dirección 67 en el registro R[3]; copia el contenido de la palabra de MP de dirección 68 en el registro R[4]; copia el contenido de la palabra de MP de dirección 69 en el registro R[5] y copia el contenido de la palabra de MP de dirección 70 en el registro R[6].
- Instrucción ADDS(m) .n, /p. Suma el contenido de la palabra de MP de dirección p con el contenido del registro R[n], dejando el resultado en R[n]; suma el contenido de la palabra de MP de dirección p+1 con el contenido del registro R[n+1], dejando el resultado en R[n+1]; ...;suma el contenido de la palabra de MP de dirección p+m-1 con el contenido del registro R[n+m-1], dejando el resultado en R[n+m-1]. Por ejemplo la instrucción:
ADDS(4) .3, /67suma el contenido de la palabra de MP de dirección 67 con el contenido del registro R[3], dejando el resultado en R[3]; suma el contenido de la palabra de MP de dirección 68 con el contenido del registro R[4], dejando el resultado en R[4]; suma el contenido de la palabra de MP de dirección 69 con el contenido del registro R[5], dejando el resultado en R[5] y suma el contenido de la palabra de MP de dirección 70 con el contenido del registro R[6], dejando el resultado en R[6].
El formato de instrucciones es el siguiente. Las instrucciones
pueden ocupar una o dos palabras (16 o 32 bits). Las instrucciones CLR,
DEC y HALT, cuya funcionalidad es la misma que en Símplez (en el caso
de CLR y DEC, ahora hace falta especificar el registro de ML sobre el que
operan), ocupan una sóla palabra. Las demás instrucciones
ocupan dos palabras. Los campos del formato de instrucciones vienen presentados
en la figura 1.
LDS(6) .0, /400 ADDS(6) .0, /408 STS(6) .0, /416 HALT
Calcule el número de accesos a MP (lecturas y escrituras) necesarios para ejecutar este programa. Escriba en ensamblador de Símplez un programa que haga lo mismo que éste, es decir, un programa que sume dos listas de números almacenadas en MP en las palabras de direcciones 400 a 405 y 408 a 413 y deje el resultado en las palabras de MP de direcciones 416 a 421. Calcule el número de accesos a MP necesarios para ejecutar el programa en Símplez que ha escrito.
Solución:
Accesos a MP para programa Símplez-SIMD= 25 (18 para leer y escribir los datos; 7 para leer las instrucciones).
Programa equivalente en Símplez:
LD /400 ADD /408 ST /416 LD /401 ADD /409 ST /417 LD /402 ADD /410 ST /418 LD /403 ADD /411 ST /419 LD /404 ADD /412 ST /420 LD /405 ADD /413 ST /421 HALT
Accesos a MP para programa Símplez= 37 (18 para leer y escribir los datos; 19 para leer las instrucciones)
Apartado 2 (0.5 puntos)
Suponga que en Símplez se dispusiese de los modos de direccionamiento
indexado y directo. Se supone de la existencia de un registro de índice
además del acumulador. Se supone que todas las instrucciones
ocupan una palabra de MP independientemente del modo de direccionamiento.
¿Sería posible escribir un programa equivalente al realizado
en el apartado 1 para Símplez pero que necesitase un número
menor de accesos a MP para ser ejecutado? Razone la respuesta.
Solución:
No sería posible escribir un programa que requiriese un número menor de accesos a MP. El direccionamiento indexado me permitiría sustituir el código anterior por un bucle, pero las instrucciones LD, ST y ADD a ejecutar serían las mismas, por lo que el número de accesos a MP sería el mismo o mayor.
- puertas lógicas
- puertas triestado
- biestables
- decodificadores
- multiplexores
- unidades aritmético-lógicas
- registros
- buses
- memorias
Solución: (hay otras soluciones posibles)
La ruta de datos propuesta se presenta aquí. Los elementos añadidos se presentan de color rojo.
En primer lugar, debemos almacenar en la ruta de datos los campos de la instrucción que se va a ejecutar. Una posibilidad sería utilizar un registro de 16 bits para la primera palabra y otro, también de 16 bits para la segunda. El problema de este enfoque es que necesitamos poder decrementar los bits del campo NR e incrementar los bits del campo CR (cada vez que se realiza una copia o una suma en las instrucciones SIMD). Por resolver este problema utilizaremos 4 registros, todos ellos sensibles al flanco de bajada del reloj:
Para completar el diseño, debemos pensar en las operaciones que se realizarán en la ruta de datos para ejecutar cada instrucción. Para las instrucciones no SIMD el proceso es el mismo que en Símplez, salvo que, cuando sea necesario utilizar un registro de ML se utilizará el valor del registro CR para seleccionarlo.
En el caso de las instrucciones SIMD se plantea su ejecución siguiendo los siguientes pasos:
Para poder realizar estas operaciones es necesario añadir lo siguiente a la ruta de datos:
Las figuras a continuación muestran los circuitos de los bloques "N=0" y "N + CR > 15".
|
|
Bloque "N=0"
|
Bloque "N + CR> 15"
|