Fundamentos de Estructura de Computadores
GB5 1 2/1 3
Prá cti ca 1 : MI PS.Ensambl ador . Re a l i z a : J u a nGa j e t eyA n aGó me z Re v i s a : Da n i e l Ma r t í n e zyJ u a n maMo r e n o F A Q: Mi r i a mCo r c h e r oyCr i s t i a nA mb r o s i o
Iniciamos el programa MARS tal y cómo se nos indica en el desarrollo de la práctica, siguiendo cada una de las instrucciones que se nos dan. Recapitularemos a continuación las acciones más importantes: • Por tanto abrimos el archivo Fibonacci.asm a través del icono en la barra de menú Archivo -> Abrir.
o
• Luego ensamblamos el programa con el botón • Ahora utilizamos la casilla de verificación para cambiar el formato de visualización entre decimal y hexadecimal. • Luego en el menú Configuración seleccionamos la casilla de verificación “mostrar pantalla de etiquetas” y la casilla de “permitir pseudo-instrucciones”. • Entonces arrastraremos la barra deslizante para cambiar la velocidad de ejecución hasta 10 instrucciones por segundo para ver como se desarrolla la acción paso a paso en vez de ver el resultado final del programa. • Finalmente ejecute el programa con el botón . Con los demás botones próximos iremos pudiendo adelantar y retroceder la ejecución del programa paso a paso o hasta su inicio o final. Ahora sí continuamos con la ejecución y vemos cómo se nos muestra lo esperado en la ventana de resultados entrada/salida:
Con el ejemplo 11 veremos ahora cómo modificar el contenido de la memoria, y de manera igualitaria, un registro. Siguiendo las instrucciones obtenemos que tras crear un punto de interrupción –breakpoint- marcando la casilla de verificación de la izquierda de la primera instrucción de la subrutina que imprime los resultados, restablecemos el programa y lo volvemos a ejecutar, provocamos que esta vez se detenga en el breakpoint.
Si a continuación hacemos doble click en las celdas, podremos cambiar el contenido introduciendo cualquier dato mediante el teclado y pulsando Intro después, de manera que así de fácil estaremos cambiando las posiciones de memoria.
Tras esto variaremos el valor de uno de los números de las celdas y pulsaremos Clear para borrar la ventana de RUN I/O. Si contiuamos a partir del punto de interrupción, veremos que la salida incluye el número cambiado en vez del número correspondiente a la serie de Fibonacci.
En el ejercicio 13, modificaremos el programa con el que hemos estado trabajando hasta ahora para que se le pida al usuario para la longitud de la secuencia de Fibonacci. • Para ello, pulsaremos la pestaña Editar para volver a la ventana donde se muestra el código. • Para MIPS, el símbolo de comentarios es #. Tras eliminarlo, se puede entonces compilar ese trozo de código que se nos indica. • Se pide averiguar el parámetro correcto para realizar el syscall para realizar la lectura de un entero. Pudiendo consultar la ayuda, vemos que el número que faltaba era el 5. Explicaremos a continuación el por qué de este parámetro y cómo se realizan los syscall en la sesión de FAQs. Una vez añadido, el programa nos quedaría tal que así:
•
Ejecutándose correctamente, vemos cómo nos pide un valor
y genera el siguiente resultado con los 6 primeros números (según el número introducido) de la serie de Fibonacci.
Por último, en el ejercicio 15, deberemos modificar el programa suministrado para que el cálculo de la secuencia se haga con los tres valores previos, es decir F[n] = F[n-3] + F[n-2] + F[n-1]. Deberemos cambiar entonces el contador del bucle, ya que trabajaremos ahora hasta el término n-3. Para ello, en la línea 26 se sustituye el valor -2 por -3. Habrá que predefinir término n=2, como ya se encontraban predefinidos F[0] y F[1]. Dicho término, siguiendo la nueva expresión de la serie, sería F[2]=1+1+0=2. Por tanto en la línea 22, almacenamos en un registro libre el valor, y en la línea 25 lo cargamos en la dirección 8 (donde iría el tercer término, es decir n=2) del registro $s0, donde está el vector con la serie.
En la línea 31, añadimos una tercera instrucción para obtener el valor de F[n-1], el último término de los tres con los que se operará, y no olvidamos aumentar en 4 el valor de la dirección, para seguir recorriendo el registro $s0 que almacena el vector de la serie. Como la instrucción suma solo permite dos operandos, hacemos una suma parcial de F[n-3] + F[n-2], como vemos en la línea 32, y dicho a resultado, almacenado en $s2, le sumamos finalmente el término F[n-1] (línea 33). Almacenamos en la dirección siguiente, 12, el resultado de la operación, consiguiendo que el término n contenga la suma de los tres términos anteriores. De esta manera, el bucle continuará hasta su final.
Pasaremos ahora con estos conocimientos a resolver los problemas propuestos:
PROBLEMA 1 Modificar el c贸digo anterior para que se cargue en los registros s0, s1, s2, s3 y s4 el vector denominado array_media.
PROBLEMA2 Repetir para el tercer vector de enteros de palabras denominado array_palabra
PROBLEMA 3 A帽adir en el c贸digo del problema 1, las l铆neas necesarias para mostrar por pantalla solo los elementos impares del array tratado.
PROBLEMA 4 Añadir en el código del problema 2, las líneas necesarias para mostrar por pantalla solo los elementos pares del array tratado, separados por una coma.
PROBLEMA 5 Escribe el código de un programa que sume dos valores almacenados en memoria. Estos dos valores reciben los nombres Numero1 y Numero2 y sus valores son respectivamente 100 y -10. Para el resultado realice una reserva de espacio en memoria a continuación de Numero1 y Numero2 (Utilice la directiva .space). Para la carga de memoria en registros use t0 para Numero1 y t1 para Numero2.
PROBLEMA 6 Modificar el código anterior para que al término de la suma del array guarde en memoria el resultado. Considere que inicialmente habrá que efectuar una reserva de memoria para esta variable a la que denominaremos “SUMA”.
PROBLEMA 7 Diseñe un código para almacenar en un array en memoria, denominado array1, los siguientes valores enteros de 32 bits: 5, 13,-7,-5, 17.
PROBLEMA 8 Copie el contenido de array1, de 5 elementos enteros y ubicado al principio de la memoria de datos, en array 2, situado dos posiciones más delante de array1. Array1={2,34,12,-4,6}
PROBLEMA 9 Diseñe el código de un programa que determine el elemento de mayor valor dentro de un array de cuatro elementos. Debe mostrar por pantalla tanto el índice del elemento como el valor, precedidos ambos por los textos: “Índice” y “Valor”.
PROBLEMA 10 Diseñe un código que pida por teclado dos valores enteros, que los sume y muestre el resultado por pantalla.
PROBLEMA 11 Mediante indices y bucles desarrolle un código que muestre por pantalla un array de bytes almacenado en memoria. La presentación por pantalla atenderá al siguiente formato: “<Nombre del ARRAY>”={VALOR 1, VALOR 2,...}.
1. ¿Para qué sirve el syscall y cómo se realiza? Es una llamada al sistema para realizar distintas ejecuciones según el programador desee, como por ejemplo:
Paso 1. Cargaremos el número del servicio a realizar por la llamada al sistema en $v0 li
$v0, 1
Paso 2. Cargaremos en $a0 argumentos de otros registros o etiquetas si fuera necesario (instrucción principalmente para imprimir datos) la $a0,resultado Paso 3. Utilizamos la instrucción SYSCALL syscall Paso 4. Si fuera necesario, recuperaremos los valores devueltos en algún registro
2. ¿Cómo se en qué registro tengo que operar? Generalmente siguen esta estructura: La suma, add $t0 $t1, $t2 Esto significa que en el registro t0 guarde la suma del registro t1 y t2. A la derecha se observa una imagen donde se recogen Los distintos campos de una instrucción según el tipo.
3. ¿Sólo puedo sumar registros? No, también puedes realizar operaciones lógicas, saltos, etc… Cada una de estas acciones se realiza mediante distintas instrucciones que puedes encontrar definidas en el Apendice Hennessy Patterson.
4. ¿Puedo realizar comentarios en mis programas? Sí, puedes realizarlos siempre y cuando vayan detrás de un # y en una misma línea, ya que tendrás que poner otro en la siguiente y así sucesivamente.
5. ¿Existe algún tipo de atajo con el teclado para ensamblar? Sí, pulsando F3 obtienes una tecla de acceso rápido para ensamblar.
6. ¿Existe una tecla de atajo para ejecutar el programa? Sí, pulsando F5 ejecutas el programa.
7. ¿Existe una tecla de atajo para limpiar “Mars Messages”? Sí, pulsando Ctrl-K.
8. ¿Puedo ocultar la ventana derecha de MARS donde vienen los registros? Sí, justo a la izquierda de dicha ventana hay dos flechas, una con la punta en dirección a la derecha y viceversa. Pulsando en la que va dirección derecha ocultas la ventana, y pulsando la otra la muestras. Lo mismo ocurre si quieres dejar de mostrar “Mars Messages”.
9. ¿Puedo cambiar el tema del emulador, así como el fondo, comentarios, instrucciones...? Sí, solo tienes que entrar en “Settings” -> Editor. Una vez que hayas realizado el cambio, no olvides pulsar “Apply and close” para guardarlo.
10. He realizado un programa largo, tengo que cambiar una instrucción pero no la encuentro. ¿Existe un buscador para encontrarlo directamente? Claro, en el Menú “Edit” tienes la opción “Find/Replace” que encuentra la palabra, instrucción... que estés buscando. Además tienes un acceso rápido a él pulsando Ctrl-F.