6 de febrero de 2008. 16 h. Escuela Técnica Superior de Ingeniería Informática Camino del Cementerio s/n. 47011 Valladolid EXAMEN ORDINARIO DE ORGANIZACIÓN DE COMPUTADORES NOTA: Los alumnos con las prácticas pendientes deben sacar una nota mínima de 2 en el primer problema para superar la parte práctica de la asignatura. 1 (3 p.) a) Escribir una función en lenguaje ensamblador de SPARC con los siguientes parámetros: El primer parámetro será un número entero comprendido entre 0 y 511. El segundo parámetro será una dirección que apuntará a un dato de 512 bits que representarán a los elementos de un conjunto. El tercer parámetro será un número entero que representará a una variable lógica. La función debe devolver VERDADERO (distinto de 0) en el último parámetro si, y sólo si, el elemento del conjunto cuyo número viene dado por el primer parámetro pertenece al conjunto representado por la cadena de bits apuntada por el segundo. b) Utilizar la función escrita en el apartado anterior para escribir otra función que pida por teclado un número comprendido entre 0 y 511 (que no es necesario validar), y escriba por pantalla "PERTENECE" si el elemento determinado por ese número pertenece al conjunto cuya cadena que lo representa está apuntada por un parámetro de la función, y "NO PERTENECE" en caso contrario. NOTA: El orden de los bits en la cadena que representa al conjunto puede tomarse como se desee. Solución de ambos apartados: LF=10.data cadnum:.skip 4 Nopert:.ascii "NO " Pert:.asciz "PERTENECE\n" mensaje:.asciz "Introduzca un número entre 0 y 511: ".global main.text pertenencia:! Apartado a)! i0: Número del que se desea conocer la pertenencia! i1: Apuntador a la cadena de bits representativa del conjunto! i2: Variable lógica que devuelve la pertenencia srl %i0, 3, %l1! Número de byte = índice and %i0, 7, %l2! Bit dentro del byte mov 1,%l3 sll %l3,%l2, %l2! %l2 = Máscara ldub [%i1+%l1], %l4! Carga del byte seleccionado btst %l2, %l4! Miro el bit correspondiente al elemento be Salir! bit=0 ==> No pertenece clr %i2! Ciclo adelantado mov 1, %i2! bit=1 ==> Sí pertenece Salir: ret
Procedimiento:! Apartado b)!parámetro:! i0: Dirección de la cadena de bits que representa al conjunto set mensaje,%o0 call imprime_cadena set cadnum, %o0 call Lee_cadena call ascii2bin mov %o1,%o0 mov %i0, %o1 call pertenencia set Nopert, %o0 tst %o2 beq Np set Pert, %o0 Np: call imprime_cadena ret imprime_cadena:! i0: Dirección de la cadena! i1: Longitud máxima, si i1 es 0 se supone que la longitud maxima es 255 save %sp, -64, %sp tst %i1 bne continuar mov 255, %i1 continuar: ldub [%i0+%l1], %o0 tst %o0 be retornar call putchar deccc %i1 bne continuar retornar: ret 2
Lee_cadena:!Parámetro:! i0: Dirección donde se guardará la cadena leída bucle1: call getchar stb %o0,[%i0+%l1] cmp %o0,lf bne bucle1 dec %l1 stb %g0, [%i0+%l1] ret ascii2bin:! i0: Dirección donde está la cadena con el número en decimal (sólo positivos)! i1: Salida: número en binario clr %i1 bucle: ldub [%i0+%l1],%l2 cmp %g0,%l2 be final bclr 48,%l2 mulx %i1,10,%i1 add %i1,%l2,%i1 ba bucle final: ret 2 (1.5 p.) Explicar qué sentido tienen los operandos inmediatos rápidos en el MC68000. Qué otro procesador tiene algo parecido? (explíquese, por supuesto). Los operandos inmediatos rápidos del MC68000 suponen un ahorro de memoria ya que evitan la palabra adicional para codificar operandos inmediatos cuando éstos ocupan pocos bits (es decir, la mayoría de las veces). Un procesador que tiene algo parecido es el VAX, que tiene operandos literales, éstos son operandos inmediatos de pocos bits, que también ahorran varios bytes de memoria. 3
Dirección Contenido 016654 000006 016656 000524 016660 177701 016662 002211 016664 003654 016666 177726 016670 003711 016672 012702 016674 016656 016676 016703 016700 177752 016702 010204 016704 060304 016706 006203 016710 111200 016712 114422 016714 110014 016716 077304 Figura 1. 3 (2.5 p.) Sea un PDP-11 cuya memoria se encuentra en el estado mostrado en la figura 1 (todo en octal): a) Decodificar el programa que se encuentra a partir de la dirección 016672 (8 MOV #16656, R2 MOV N, R3 ;N = 177752 (8 + 016702 (8 = 016654 (8 MOV R2, R4 ADD R3, R4 ASR R3 X: MOVB (R2), R0 MOVB -(R4),(R2)+ MOVB R0, (R4) SOB R3, X b) Describir los efectos de ese programa sobre la memoria. Al final del programa la memoria queda como sigue: Dirección Contenido 016654 000006 016656 104404 016660 140777 016662 052001 El resto queda sin cambios 4
c) Cual puede ser el propósito de ese programa? El programa invierte un vector de bytes (o caracteres) que comienza en la dirección apuntada por R2 (en nuestro caso 016656 (8 ). La longitud del vector está especificada en la dirección N (en este caso 6). d) Calcular el tiempo de ejecución del programa suponiendo que cada acceso a memoria emplea 0,1 µsg. prescindiendo de otros factores. Número de accesos: Fuera del bucle: Código: 7 Datos: 1 (N) Dentro del bucle: Código: 4 Datos: 4 ((R2), (R4), (R2)+ y (R4)) Número total de accesos: 7 + 1 + 3 (4 + 4) = 32 Por tanto, el tiempo total será: 32 0, 1 = 3, 2 µsg 4 (1.5 p.) Supongamos que el símbolo P representa una dirección de memoria de un PDP-11. Explicar la diferencia entre referirse a esa dirección simplemente como P o como @#P. Explicar razonadamente la utilidad de emplear cada una de esas formas. Si se representa a la dirección como P se está utilizando direccionamiento relativo, es decir, lo que se especifica en la instrucción es la diferencia entre el contador de programa y la dirección del dato. Esto es lo habitual para las variables de un programa. Si se emplea @#P, se está utilizando direccionamiento absoluto, por lo que la instrucción especifica la dirección misma del dato (no relocalizable). Esto sólo se utiliza para direcciones de sistema. 5 (1.5 p.) Explicar brevemente cuál es el cometido del apuntador de trama. Explicar cómo se modifica ese registro durante las llamadas y retornos de procedimiento. Qué registro hace esa función en un VAX? El apuntador de trama constituye un apuntador a un punto fijo de la trama de pila de cada procedimiento, en contraste con el apuntador de pila (SP) que es un apuntador bastante inestable debido a sus constantes variaciones. Mediante el apuntador de trama puede accederse tanto a los parámetros (con desplazamientos positivos) como a las variables automáticas del procedimiento (con desplazamientos negativos). En las llamadas a procedimientos este apuntador adquiere el valor del SP en un momento fijo (normalmente después de haberse guardado el valor del PC (dirección de retorno). En los retornos se recupera su valor de la pila para que apunte a la trama del procedimiento anterior. En el VAX la función del apuntador de trama se la reparten dos registros: por una parte el FP (frame pointer), que apunta a la trama de pila para acceder a las variables automáticas y por otra, el AP (argument pointer) que apunta a la lista de argumentos. 5