viernes, abril 15, 2005

Laboratorio MIPS(SPIM)

- Cuando ejecuté el ejemplo ´Suma´ me di cuenta que hacer un "open" del archivo es hacerle un "load", y luejo solo hay que invocar "go" para que se ejecute.
La salida que produjo es la indicada en la descripcion del laboratorio.
Al principio me daba un error: No podia encontrar el archivo de exceptions.s ya que lo buscaba por default en la carpeta "Program Files" y yo tengo el Windows en español, y por lo tanto estaba en la carpeta "Archivos de Programa". Una vez le cambie la dirección funciono perfectamente.


- En la ejecucion paso a paso se entiende mejor el funcionamiento del programa.
QUe interesante poder observar la ejecucion detalladamente, asi los errores se
encuentran un poco mas fácil.
Una de las cosas que pude observar fue, que mientras no se haga un SYSCALL las
operaciones de I/O no se llevan a cabo, es decir esta instruccion viene a ser la
orden de ejecucion para el CPU.
Aunque hay partes que aun no entiendo del programa, ya que al verlo correr asi, se
ven todas las instrucciones en Asembler.
Necesito profundizar un poco mas en mi lectura para poder comprender al 100%.


- Para comprobar el valor de los registros, segun lo que leí en el documento, es con el comando "print" pero en las opciones disponibles no lo encontre. Talvez baje una version vieja de SPIM, la que instale es la v 7.1.

- Suma1.s ....
con este no tube mucho problema, solo le agrege unas pocas lineas:

-> un string adicional
cad3: .asciiz " y el producto de ambos es: "

-> una instrucion de multiplacion que guarda en un tercer registro $s3 el
-> producto de $s0 y$s1
mul $s3, $s0, $s1 # Se multiplican ambos números

-> un conjunto de intrucciones para imprimir el resultado, casi iguales a la
->provistas en suma.s con diferentes strings y registro de resultado.
addi $v0, $zero, 4
la $a0, cad3
syscall
# Se escribe el resultado2
addi $v0, $zero, 1
add $a0, $zero, $s3
syscall

- Suma2.s ....
Este ejemplo requiere un poco mas de trabajo, le agregue mas lineas:

-> dos strings adicionales
cad2: .asciiz "El menor de los números es:: "
cad3: .asciiz "Los dos numeros son iguales! "

-> tres instrucciones de comparacion, A=primer número leido, B=segundo
->número leido C=guarda comparaciones
beq $s0, $s1, if_iguales # Se verifica si los numeros son iguales
slt $s3 $s0 $s1 # Se verifica si A < B y setea C($s3) a 1 si
# es cierto, sino a 0
blez $s3, AmayorB # Se verifica si C <= 0. Si es A > B

# Si es A < B
addi $v0, $zero, 4
la $a0, cad2
syscall
# Se escribe el numero
addi $v0, $zero, 1
add $a0, $zero, $s0
syscall

b end_if # Salta statements

if_iguales:
# Se escribe el mensaje de igualdad
addi $v0, $zero, 4
la $a0, cad3
syscall
# Fin del programa.
addi $v0, $zero, 10
syscall

AmayorB:
addi $v0, $zero, 4
la $a0, cad2
syscall
# Se escribe el numero
addi $v0, $zero, 1
add $a0, $zero, $s1
syscall
end_if:



->Lo que hago, logicamente, es comparo si son iguales si es cierto ejecuto las
instruciones de la etiqueta if_iguales, sino comparo si A < B guardo
resultado, si no es cierto (1) ejecuta las instrucciones de etiqueta
AmayorB, sino imprime A es menor.


* En general no hubo dificultad para explorar y entender el emulador y el conjunto de instrucciones assembler, solo lo que normalmente le lleva a uno "asumir" una nueva herramienta, con la diferencia que esta me gusto mucho. Pero aun me falta profundizar mas.
Con lo que si tube problemas fue con bajar el documento, ya que los links estan malos, nunca pude bajar los pdf, baje los .ps y los pase a pdf.
*En general el laboratorio estubo interesante y entretenido.