Sunteți pe pagina 1din 5

EJERCICIOS DE PRACTICAS DE ENSAMBLADOR MIPS ESTRUCTURA / ORGANIZACIN DE COMPUTADORES BOLETN N 3

Ejercicio 11:

(Modos de direccionamiento)

Realizar un programa en ensamblador del MIPS que cargue el contenido de una posicin de memoria en un registro y luego escriba el valor del registro en consola. Debe repetir esta operacin para cada uno de los 7 modos de direccionamiento existentes en el MIPS (estudiar la transparencia n 10 del tutorial). Comprobar que en la consola aparece siempre el mismo valor (pues son modos distintos de acceder a un mismo dato). Se recomienda ensear al profesor el cdigo desarrollado, con el objeto de identificar correctamente cada modo de direccionamiento.

Ejercicio 12:

(Implementacin de la condicin if-then)

Se pretende realizar un programa en lenguaje ensamblador equivalente al siguiente cdigo en C:


#include <iostream.h> main() { int a[] = {12, 5, 34, 75, 10, 25}; int n = 6; int max, i; for (max = i = 0; i < n; i++) if (a[i] > max) max = a[i]; cout << max << end1; }

Este programa calcula el mximo de los elementos del array a, almacendolo en la variable max. Estudiar el cdigo ensamblador equivalente comparndolo con el cdigo C:
# Prcticas ensamblador MIPS # UEX 2003/2004 .text .globl main main: li $t0, 0 li $s0, 0 lw $s1, n m1: bge $t0, mul $t1, lw $t2, ble $t2, move $s0, addi $t0, b m1 move $a0, li $v0, syscall $s1, m3 $t0, 4 a($t1) $s0, m2 $t2 $t0, 1 $s0 1

# i en $t0 # max en $s0 # n en $s1

m2: m3:

# # # # #

$t1: cuenta en bytes $t2 <-- a[i] salta el then si a[i] <= max then: max = a[i] i++

# Fin del bucle

li $v0, 10 syscall .data .word 12, 5, 34, 75, 10, 25 .word 6 .word 0

a: n: max:

Estudiar en profundidad el funcionamiento del cdigo, ejecutndolo en el simulador. Cuestin: Dibujar un diagrama de flujo que describa las operaciones realizadas en el cdigo ensamblador.

Ejercicio 13:

(Implementacin de la condicin if-then-else)

Se pretende realizar un programa en lenguaje ensamblador equivalente al siguiente cdigo en C:


#include <iostream.h> main() { int a[] = {-12, 5, -34, -75, -10, 25}; int n = 6; int max, i; int npos, nneg; for (i = npos = nneg = 0; i < n; i++) if (a[i] > 0) npos++; else nneg++; cout << +: << npos << ; -: << nneg << end1; }

Este programa cuenta, en las variables npos y nneg, cuntos nmeros positivos y negativos, respectivamente, aparecen en el array a. Estudiar el cdigo ensamblador equivalente comparndolo con el cdigo C:
# Prcticas ensamblador MIPS # UEX 2003/2004 .text .globl main main: li $t0, 0 li $t1, 0 li $t2, 0 lw $s1, n m1: bge $t0, mul $t3, lw $t4, bgez $t4, addi $t2, b m3 addi $t1, addi $t0, b m1 move $a0, li $v0, syscall la $a0, li $v0, syscall move $a0, li $v0, syscall li $v0, syscall $s1, m4 $t0, 4 a($t3) m2 $t2, 1 $t1, 1 $t0, 1 $t1 1 salto 4 $t2 1 10 # Escribe nneg

# # # #

i en npos nneg n en

$t0 en $t1 en $t2 $s1

m2: m3: m4:

# # # # # # #

$t3: cuenta en bytes $t4 <-- a[i] if ( a[i] > 0 )... else: nneg++ salta sobre then then: nneg++ i++

# Escribe npos

# Finaliza

a: n: max: salto:

.data .word -12, 5, -34, -75, -10, 25 .word 6 .word 0 .asciiz \n

Estudiar en profundidad el funcionamiento del cdigo, ejecutndolo en el simulador. Cuestin: Dibujar un diagrama de flujo que describa las operaciones realizadas en el cdigo ensamblador.

Ejercicio 14:

(Estructura while)

Realizar un programa en ensamblador del MIPS equivalente al siguiente pseudocdigo:


inicio cadena: texto leer (texto) escribir ( cal_longitud ( texto ) ) fin entero funcin cal_longitud ( E cadena: cad ) inicio entero: i=0, long=0 mientras cad[i]!=NULL hacer long <-- long+1 i <-- i+1 fin_mientras devolver ( long ) fin_funcin

El programa calcula la longitud de una cadena de texto introducida por teclado. La funcin cal_longitud, que realiza el clculo, utiliza una estructura del tipo while. NULL hace referencia al carcter nulo, cuyo cdigo ASCII es 0. Indicaciones: Traducir a cdigo ensamblador la estructura while usando una instruccin beqz. Inicialmente asignar un tamao de 32 caracteres al buffer para lectura por consola. En el segmento de datos, en lugar de definir el array para lectura por consola (texto) mediante la directiva .asciiz, usar la directiva .space y asignarle 32 bytes de espacio (ver la transparencia n 8 del tutorial). El formato de la salida por consola, debe ajustarse al siguiente ejemplo:

Ejecutar el programa en el simulador SPIM y comprobar su funcionamiento correcto en los distintos casos posibles. Cuestin: Comprobar en particular el funcionamiento del programa en los casos: a) introduciendo un retorno de carro al final de la cadena, b) introduciendo el mximo nmero de caracteres que admita el programa. Explicar los resultados en ambos casos.

Ejercicio 15:

(Estructura do-while)

Realizar un programa en ensamblador del MIPS equivalente al siguiente pseudocdigo:


inicio cadena: texto_en, texto_sal leer ( texto_en ) llamar_a copia_texto ( texto_en, texto_sal ) escribir ( texto_sal ) fin procedimiento copia_texto ( E cadena: cad_en, S cadena: cad_sal ) inicio entero: i=0 repetir cad_sal[i] <-- cad_en[i] i <-- i+1 hasta que cad_en[i]=NULL fin_procedimiento

El programa copia una cadena (introducida por teclado) en otra posicin de memoria. El procedimiento copia_texto, que realiza la copia, utiliza una estructura del tipo do_while. NULL hace referencia al carcter nulo, cuyo cdigo ASCII es 0. Indicaciones: traducir a cdigo ensamblador la estructura do_while usando una instruccin bnez. Reservar espacio para los arrays texto_en y texto_sal mediante la directiva .space. Ejecutar el programa en el simulador SPIM y comprobar su funcionamiento correcto en los distintos casos posibles. Comprobar en la ventana de datos de la herramienta que realmente se realiza la copia de la cadena en otra posicin de memoria.

Ejercicio 16:

(Bucles y condiciones)

Realizar un programa en ensamblador del MIPS que ordene en orden ascendente los elementos de un vector mediante el mtodo de intercambio o de burbuja. Se trata de un algoritmo simple de ordenacin basado en comparar elementos adyacentes e intercambiarlos entre s hasta que estn todos ordenados. Si los elementos del vector se etiquetan a[1], a[2], ... a[n], el algoritmo de dicho mtodo de ordenacin es:
inicio bandera <-- 'F' // F, falso; V, verdadero mientras bandera='F' hacer bandera <-- 'V' desde k <-- 1 hasta n-1 hacer si a[k] > a[k+1] entonces intercambiar(x[k], x[k+1]) bandera <-- 'F' fin_si fin_desde fin_mientras fin

Los elementos del vector deben introducirse como un array de enteros en el segmento de datos del programa. Tambin debe introducirse en el segmento de datos la dimensin del vector (n). El programa en ensamblador debe incluir un procedimiento que realice la ordenacin del vector y otro procedimiento que escriba en consola todos sus elementos, separados por un espacio. Al ejecutarlo, debe mostrar en consola todos los elementos del vector, primero desordenados y a continuacin ordenados, segn el siguiente formato:

Ejecutar el programa en el simulador SPIM y comprobar su funcionamiento correcto en los distintos casos posibles.

Ejercicio 17:

(Bucles y condiciones)

Modificar el programa del ejercicio 16 para que el procedimiento de ordenacin utilice el mtodo de ordenacin por seleccin. Dicho mtodo se basa en buscar el elemento menor del vector y colocarlo en primera posicin, a continuacin buscar el segundo elemento ms pequeo y colocarlo en la segunda posicin, etctera. Los pasos sucesivos a dar son: 1. Seleccionar el elemento menor del vector de n elementos. 2. Intercambiar dicho elemento con el primero. 3. Repetir estas operaciones con los n-1 elementos restantes, seleccionando el segundo elemento. Continuar con los n-2 elementos restantes hasta que slo quede el mayor. Si los elementos del vector se etiquetan a[1], a[2], ... a[n], el algoritmo de dicho mtodo de ordenacin es:
inicio desde i <-- 1 hasta n-1 hacer aux <-- a[i] k <-- i desde j <-- i+1 hasta n hacer si a[j] < aux entonces aux <-- a[j] k <-- j fin_si fin_desde a[k] <-- a[i] a[i] <-- aux fin_desde fin

Ejecutar el programa en el simulador SPIM y comprobar su funcionamiento correcto en los distintos casos posibles.

S-ar putea să vă placă și