Enunciado LAB1

Anuncio
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.
Descargar