Pregunta
Estoy trabajando en un código MIPS para mi clase de Organizaciones informáticas y, bueno, parece que no puedo hacer que MIPS funcione correctamente y no hay tantos recursos MIPS en línea.Estoy ejecutando el código en PCSPIM.Se supone que el código debe agregar 10 al contenido de la matriz2 y almacenarlos en la matriz1 y luego imprimir la matriz 1.Reelaborado, el código funciona correctamente ahora.
.text
main:
la $t0, array1
la $t1, array2
la $s0, valuec
li $s2, 6
add $t6, $zero, 1 #i = 1
Loop:
addi $t6, $t6, 1 #i++
lw $t2, ($t0)
lw $t5, ($t1)
lw $s1, ($s0)
addu $t2, $t5, $s1
sw $t2, ($t0)
add $t0, $t0, 4
add $t1, $t1, 4
li $v0, 1
move $a0, $t2
syscall
blt $t6, $s2, Loop
li $v0, 10
syscall
.data
array1: .space 20
array2: .word 1,2,3,5,9
valuec: .word 10
PCSPIM imprime 0 5 veces y devuelve la Excepción 7 [Dirección de datos incorrectos] que se produjo y se ignoró
Solución
Esto es tarea, así que solo te daré pistas por ahora y las iré ampliando a medida que avances.Un par de cosas:
1/ Necesitas decirnos qué es supuesto hacer.Eso es lo más importante.
2/ Almacena la dirección de la matriz1 en t0 y luego reutiliza t0 dentro del primer ciclo.
3/ Parece estar confundido acerca de las direcciones y el contenido de esas direcciones ("la $s0, valuec"
y "addu $t0, $t1, $s0"
).
ACTUALIZAR:
En realidad, tengo que desconectarme por un tiempo, así que publicaré mi solución para no dejarte en la estacada.
La confusión a la que me referí antes fue el hecho de que estás cargando dos direcciones en $t1 y $s0, y luego las sumas para obtener otra dirección; es probable que esto esté mucho más allá de tu área de datos (realmente deberías agregar una dirección y un desplazamiento).
Ese es básicamente el problema que tienes con tu código (tanto los ceros que se imprimen como el bloqueo).Su mejor opción sería solucionarlo y consultar mi código a continuación solo como último recurso para ver cómo lo habría hecho.Copiar código no le ayudará a largo plazo y sería prudente asumir que su profesor también está comprobando todos los sitios web en busca de plagio.
Este es el código que se me ocurrió (rápido, por lo que tendrás que probarlo; puede que tenga errores).Te sugiero leer los comentarios en excelente detalle para entender lo que está haciendo.
Volveré en unas horas para ver cómo estás.Salud.
.text
main:
# Initialization of array pointers and loop
la $t0, array1 # address of array 1
la $t1, array2 # address of array 2
li $t2, 1 # element number
li $t3, 6 # upper limit of elements
# Process each word in array 2, adding 10 and placing
# into array 1.
Loop:
lw $t3, 0($t1) # get word from array 2
addi $t3, $t3, 10 # add 10 to word
sw $t3, 0($t0) # store word into array 1
addi $t0, $t0, 4 # move to next entry in array 1 and 2
addi $t1, $t1, 4
addi $t2, $t2, 1 # increment element number
blt $t2, $t3, Loop # loop until all elements done
# Initialize printing loop by going back to start of array 1
la $t0, array1 # address of array 1
li $t2, 1 # element number
# Loop through array 1, printing each element.
pLoop:
lw $t2, 0($t0) # get word from array 1
li $v0, 1 # 'print' command code
move $a0, $t2 # needs value in $a0
syscall # print it
addi $t0, $t0, 4 # move to next entry in array 1
addi $t2, $t2, 1 # increment element number
blt $t2, $t3, Loop # loop until all elements done
li $v0, 10 # 'terminate' command code
syscall # exit
# Data arrays for array 1 and 2
.data
array1: .word 0,0,0,0,0
array2: .word 1,2,3,4,5
Otros consejos
Hay una serie de cuestiones posibles, pero la más obvia / probable es que no se volverá de principal antes del inicio de la sección de datos.
jr ra