Grado en Ingeniería Informática
Arquitectura de Computadores – Prácticas Curso 2012-13
Ensamblador
del procesador MIPS
Simula3MS
El desarrollo de esta práctica se basa en la programación en ensamblador
del procesador MIPS. Para programar en este lenguaje usaremos el programa
SIMULA3M. Disponible en: http://simula3ms.des.udc.es/
El manual usado para
entender el simulador está disponible en el siguiente enlace.
https://docs.google.com/open?id=0B_QYUG73pxy8ekFxWTFOTnlIZzQ
Los ejercicios propuestos para esta práctica son
los siguientes:
Ejercicios
1-4
Los ejercicios propuestos del 1 al 4 se resumen como:
-
Ejercicio
1: Entender el entorno y hacer uso del manual
-
Ejercicio
2: Escribir el programa de ejemplo siguiente.
-
Ejercicio
3: Ensamblar y comprobar posibles errores en el código.
-
Ejercicio
4: Repasar sintaxis si existen errores. En caso contrario ejecutar para
iniciar el proceso de simulación de ejecución.
Observamos que al ensamblar el código no existen
errores, por lo que pasamos a la ejecución.
Ejercicio 5
En este ejercicio pide ejecutar el programa anterior
paso a paso haciendo uso del botón de “Ciclo Siguiente”.
Observamos que para cada tipo de instrucción se
muestra el camino de datos de un color distinto.
Los
registros pedidos en el ejercicio y su contenido son:
$t0: 10010000 $s0: 00000064
$t1: 10010004 $s1: fffffff6
$t2: 10010008 $s2: 0000005a
Los datos
de la memoria de datos son los siguientes:
Dirección
0x10010000: 0x00000064
Dirección
0x10010004: 0xfffffff6
Dirección 0x10010008: 0x0000005a
Ejercicio 6
Este ejercicio pide escribir el código siguiente
usando el editor, ensamblarlo y ejecutarlo. Y posteriormente explicarlo.
Inicialmente en este programa se carga un vector de 4
elementos, donde cada elemento es un número decimales ya definido. En el cuerpo
del programa se carga la dirección de memoria del vector en la variable $t1.
Luego, las 4 siguientes instrucciones cargan de la memoria de datos el valor de
cada posición del vector a partir de $t1 y el desplazamiento en las variables
$s0, $s1, $s2 y $s3.
El contenido del segmento de datos de memoria al
inicio de la ejecución es el siguiente:
0x10010000: 0x000000d2
0x10010004: 0x000000f0
0x10010008: 0x0000014a
0x1001000c: 0x00001608
Observamos
los siguientes valores:
-
Contenido del registro t1 antes de la ejecución: t1:
0x00000000
-
Valor del registro PC antes de la ejecución: PC: 00400000
-
Contenido del registro t1 después de la ejecución: t1:
10010000
-
Contenido de los registros siguientes al término de la
ejecución:
s0: 000000d2
s1: 000000f0
s2: 0000014a
-
Valor del registro PC al término de la ejecución: PC:
00400018
Ejercicio 7
Este ejercicio pide que se escriba el siguiente código
usando el editor de Simula3MS, ensamble, ejecute y compruebe el resultado.
Código:
.data
.text
.globl main
main:
li
$a0,0x0000000F
li
$v0,0x00000001 # La llamada
asociada con imprimir por pantalla
# un entero es la 1
syscall # Efectúa la llamada y
muestra por pantalla
# el decimal 15
li
$v0,0x0000000A # La llamada que
indica al procesador que
# se terminado la ejecución es EXIT,
# de
código 10 decimal
syscall # Efectúa la llamada
Debemos saber que para pedir un servicio hay que
cargar el código de la llamada deseada en el registro de MIPS denominado $v0 y
los argumentos que se van a mostrar o leer en los registros $a0 ó $a1. Una vez
establecidos estos valores se procederá a efectuar la llamada con syscall.
Tras
ensamblar y ejecutar el código observamos que el resultado mostrado es 15.
Ejercicio
8
Este ejercicio se pide la realización de un programa
que solicita por teclado tres valores enteros y los almacena en memoria en un
vector llamado “vector” para el que previamente se habrán reservado cuatro
palabras de memoria, tres para los enteros introducidos y un cuarto para
guardar el resultado final. Luego se completa el programa efectuando la suma de
los elementos del vector construido y se muestra por pantalla.
El programa es el siguiente:
.data
vector: .word 0,0,0,0
.text
.globl main
main:
#Insercción de números
la $t1,vector # Apunta a la
dirección del 1º elemento de
li $v0,5
syscall
sw $v0,0($t1)
li $v0,5
syscall
sw $v0,4($t1)
li $v0,5
syscall
sw $v0,8($t1)
#Cargar elementos del vector para sumarlos
lw $s0,0($t1) # Carga el 1º
elemento del vector en s0
lw $s1,4($t1) # Carga el 2º
elemento del vector en s1
lw $s2,8($t1) # Carga el 3º
elemento del vector en s2
add $t0,$s0,$s1 # Suma
elementos 1 y 2
add $t0,$t0,$s2 # Suma el
resultado del anterior y elemento 3
sw $t0,12($t1) # Almacena el
resultado de la suma en la última posición del vector
lw $a0, 12($t1) # Carga el
resultado
li $v0, 1 # Muestra por
pantalla
syscall
No hay comentarios:
Publicar un comentario