Requisitos:
- Máquina Virtual de Java 1.5 o superior (Descargar Java).
- Conocimientos sobre ensamblador MIPS (Usar manual adjunto).
El software Simula3M utilizado en esta práctica ofrece un entorno de simulación muy intuitivo por lo que no nos será difícil adaptarnos a él.
Básicamente, consta de un editor dónde se escribe todo nuestro programa en ensamblador y luego hay dos botones, uno de ellos 'Ensamblar' sirve para comprobar si se han cometido errores y el segundo 'Ejecutar' sirve para simular la ejecución de nuestro programa.
En el ejercicio 1 debemos hacer uso del manual proporcionado en esta práctica (Manual_Simula3MS.pdf) para aprender a usar el simulador Simula3M.
No tiene ninguna dificultad, simplemente leer dicho manual y comprenderlo.
En el ejercicio 2 nos piden que escribamos un programa de ejemplo, para ello debemos hacer uso de lo aprendido en el ejercicio 1 para entender lo que hace el programa:
En este programa de ejemplo, se definen dos números enteros de 32 bits, uno con valor 100 y otro con valor -10 y se reserva espacio para almacenar el resultado de la suma.
Luego, se leen de memoria y se almacenan en los registros $s0 y $s1 del banco de registro del procesador, se suman y por último, se guarda en memoria el resultado en la dirección que definimos al principio en la variable resultado.
Una vez que hayamos escrito el programa debemos guardarlo y presionar el botón 'Ensamblar' para comprobar que no se produce ningún error.
Si se ha hecho bien, no debe dar ningún error.
Si se ha obtenido errores debe solucionarse con la ayuda del manual, en caso contrario, presionamos en el botón 'Ejecutar' para proceder a la simulación de dicho programa.
En este ejercicio deberemos ir anotando los cambios que se produzcan en los registros usados, en cada ciclo de programa, cada vez que pulsemos en 'Ciclo siguiente'.
El estado final de dichos registros es:
En este ejercicio debemos escribir otro programa de ejemplo, guardarlo, ensamblarlo y ejecutarlo y además explicar lo que hace:
Explicación
Se define un
vector array_word con 4 elementos del tamaño de una palabra con valores de 210, 240, 330 y 5640.
La dirección del vector es
almacenada en el registro $t1. A continuación se va cargando cada elemento del vector en los registros $s0, $s1, $s2
y $s3, que como son del tipo palabra, de una
palabra a la siguiente habrá una diferencia de 4 bytes.
Contenido del segmento de datos de memoria al inicio de la ejecución
0x10010000: 0x3c090000
0x10010004: 0x35290000
0x10010008: 0x8d300000
0x1001000c: 0x8d310004
Contenido del registro t1 antes de la ejecución
t1: 00000000
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
En este ejercicio probaremos un programa de ejemplo para hacer llamadas al sistema, apartado A.5. del manual.
En este ejercicio nos piden que creemos un programa que solicite por teclado tres valores enteros y los almacene 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 complete el programa efectuando la suma de los elementos del vector construido y muéstrelo por pantalla.
.data
# Reservamos memoria para 4 enteros (4 bytes cada uno), tres sumandos y el resultado
vector: .space 16
.text
.globl main
main:
la $t0,vector # Cargar en registro $t0, la direccion base de vector
li $v0,5 # Establecer solicitud de entero que será almacenado en v0
syscall
move $s0,$v0 # Guardar el entero en $s0
li $v0,5 # Establecer solicitud de entero que será almacenado en v0
syscall
move $s1,$v0 # Guardar el entero en $s1
# Solicita valor
li $v0,5 # Establecer solicitud de entero que será almacenado en v0
syscall
move $s2,$v0 # Guardar el entero en $s2
# Sumar
add $t1,$s0,$s1 # t1 = s1 + s0
add $t1,$t1,$s2
# Guardar en memoria los valores leidos
sw $s0,0($t0)
sw $s1,4($t0)
sw $s2,8($t0)
# Guardar en memoria el resultado de la suma
sw $t1, 12($t0)
# Mover resultado a $a0 para mostrar por pantalla
move $a0, $t1
li $v0, 1
syscall
# Salimos
li $v0,10
syscall
_________________________________________________________________
La instrucción move no es válida en Simula3M.





