Página 1 de 3 Trabajo de Laboratorio Número 1 Arquitectura de Computadoras 06/04/2014 Instrucciones El laboratorio consta de 8 ejercicios, los cuales no poseen una única solución sino múltiples soluciones. Los códigos de los programas deberán respetar la convención de registros y poseer una tabulación adecuada y comentarios. Se permite el uso de pseudoinstrucciones. Posteriormente, se tomará una evaluación con problemas similares, la cual deberá ser resuelta en forma individual. La fecha de evaluación se encuentra en el sitio web de la materia. Se recomienda la lectura del Apéndice A del libro de texto, que está publicado en el sitio. El mismo contiene, entre otras cosas, un listado completo del set de instrucciones del MIPS y un listado de las llamadas al sistema del simulador SPIM. En la 4ta edición está información se encuentra en el Apéndice B del libro. Objetivo El objetivo del laboratorio es familiarizar a los estudiantes con el set de instrucciones del MIPS R2000 y con la escritura de programas en el lenguaje ensamblador del mismo, e introducir el programa de simulación QtSpim. Ejercicios 1) El siguiente bloque de código en C busca el valor mínimo de un vector y lo almacena en una variable. int Minimo int Vector[15] = {54,5,23,65,2,84,1,78,37,97,56,26,48,13,103,18} void Comparar(int* Minimo, int Indice) { if (Minimo* > Vector[Indice]) { Minimo* = Vector[Indice]; } } void main(void) { int Indice; Minimo = Vector[0]; for(Indice = 1; Indice < 16; Indice++) { Comparar(&Minimo, Indice); } } El mismo se presenta traducido a lenguaje ensamblador del MIPS Minimo: Vector: .data .space 2 .half 54,5,23,65,2,84,1,78,37,97,56,26,48,13,103,18 .text .globl main Comparar: Retorno: lh $t0, 0($a0) la $t1, Vector add $t2, $t1, $a1 lh $t3, 0($t2) slt $t4, $t3, $t0 beq $t4, $zero, Retorno sh $t3, 0($a0) jr $ra Trabajo de Laboratorio Número 1 main: Lazo: Final: Página 2 de 3 la $t0, Vector la $a0, Minimo lh $t1, 0($t0) sh $t1, 0($a0) addi $a1, $zero, 2 slti $t0, $a1, 32 beq $t0, $zero, Final jal Comparar addi $a1, $a1, 2 j Lazo li $v0, 10 syscall Responda las siguientes preguntas: a) b) c) d) e) f) ¿Para qué sirve la pseudoinstrucción la? ¿En qué instrucciones se convierte? ¿Por qué se asigna $a1 y no $t5 o $s0 a la variable utilizada como índice? ¿Por qué el addi de $a1 es de 2 y no de 1 o 4? ¿Para qué sirve la instrucción slt? ¿Qué diferencia tiene con blt? ¿Para qué sirven las instrucciones jal y jr? ¿Qué diferencias tienen con la instrucción j? Detalle el valor que asigna SPIM a las etiquetas main, Vector, Comparar y Final 2) Escriba un programa en assembler del MIPS el cual reciba números enteros a través de la consola hasta recibir el valor cero, y en ese momento finalice devolviendo como resultado la suma y el promedio (sólo parte entera) de los números ingresados, también a través de la consola. 3) Escriba una función en assembler del MIPS la cual tome los j bits menos significativos del registro $a1 y los coloque en el registro $v1 de la forma en que se indica en la siguiente figura. Los restantes bits del registro $v1 deben permanecer sin alteraciones. Desarrolle además un programa principal para probar dicha función el cual reciba los valores de i y j por consola, controle que los mismos sean menores que 32 y que su suma sea menor a 32. En caso de errores deberá mostrar un mensaje que indique claramente la causa del problema. 4) Escriba un programa en assembler del MIPS el cual implemente el algoritmo de búsqueda binaria en forma recursiva. El número buscado deberá ser ingresado por consola y al finalizar el programa debe mostrar en la consola si el número fue encontrado en el arreglo. Todos los números, tanto el número buscado como los del arreglo, son números de 8 bits. Considere un arreglo de números que ya se encuentra ordenado en forma ascendente. void BusquedaBinaria(int Numeros[], int Inicio,int Fin, int NumBusc) { if (Inicio > Fin) printf ("%s", "NO ENCONTRADO"); return; else { int pos = (Inicio + Fin) / 2; if (NumeroBuscado < Numeros[pos]) return(BusquedaBinaria(Numeros, Inicio, pos - 1, NumBusc)); else if (NumeroBuscado > Numeros[pos]) return(BusquedaBinaria(Numeros, pos + 1, Fin, NumBusc)); else printf ("%s", "ENCONTRADO"); return; } } Trabajo de Laboratorio Número 1 Página 3 de 3 5) Escriba en assembler del MIPS una función que reciba un número n (entero), encuentre el n-ésimo número de la serie de Fibonacci. Si el programa recibe n = 1 devolverá 1, con n = 3 devolverá 2, con n = 6 devolverá 8, con n = 8 devolverá 21 y así sucesivamente. La función desarrollada debe respetar la metodología utilizada por el siguiente código escrito en C para encontrar el valor de Fibonacci buscado. int itFib(int numero){ f(numero==0) return 0; anterior=0; fibonacci=1; for(i=1; i<numero; i++){ aux=fibonacci+anterior; anterior=fibonacci; fibonacci=aux; } return fibonacci; } Escriba además un programa principal para testear el funcionamiento de la función desarrollada. El mismo debe recibir el número n y mostrar el resultado de la función utilizando la consola. 6) Del mismo modo que el ejercicio anterior escriba una función para encontrar el n-ésimo número de la serie de Fibonacci a partir de un número n recibido como parámetro de entrada. En este caso la función debe representar la metodología utilizada en la siguiente función escrita en C. int recFib(int numero){ if (numero == 0) return 0; else if (numero == 1) return 1; else return recfib(numero-1) + recfib(numero-2); Escriba además un programa principal para testear el funcionamiento de la función desarrollada. El mismo debe recibir el número n y mostrar el resultado de la función utilizando la consola. 7) Escriba una subrutina que reciba dos elementos A y B, los compare y los intercambie para retornar siempre con A menor que B. Escriba además un programa principal de prueba que lea dos valores ingresados por teclado y muestre por pantalla cuál es el menor. 8) Usando la subrutina del ejercicio anterior escriba un programa que ordene de menor a mayor los elementos de un vector de número de 8 bits sin signo usando el método de ordenamiento que usted considere conveniente. El vector debe tener como mínimo 10 elementos.