implementar en lenguaje ensamblador del MIPS el producto escalar de 2 vectores.
data # Segmento de datos
tvector: .word 6 # Tamaño de los vectores
res: .space 4 # Resultado del producto escalar
vector1: .word 6,7,8,9,4,1 # Vector 1
vector2: .word 2,3,5,4,6,7 # Vector 2
Después de la ejecución del programa ejemplo, el resultado
debe ser res=140
También se debe de poder modificar el resultador res.
Por ahora tengo esto, pero no me llega funcionar, si alguien sabe que tengo mal o que me falta se lo agradecería:
Código:
.data # Segmento de datos res: .space 4 # Resultado del producto escalar tvector: .word 6 # Tamaño de los vectores vector1: .word 6,7,8,9,4,1 # Vector 1 vector2: .word 2,3,5,4,6,7 # Vector 2 main: la $a0,vector1 # $a0 <-- dirección base del array vector1 la $a1,vector2 # $a1 <-- dirección base del array vector2 lw $a2,tvector # $a2 <-- tamaño del array = n li $a3,140 # $a3 <-- valor que le daremos a res sw $a3,res # $a3 <-- carga el contenido de la memoria en la dirección especificada de 32 bits en res jal ip # invoca rutina ip, guarda en $ra la dir. de vuelta move $a0, $v0 # escribe en consola el resultado (que ip dejó en $v0) li $v0, 1 syscall li $v0, 10 syscall ip: li $v0, 0 # inicializa sum a 0. $v0 guardará el resultado que devuelve la rutina li $t3, 0 # $t3: índice de los elementos del array (i) ip1: bge $t3, $a3, res # sale cuando i >= res lw $t0, 0($a0) # $t0 <-- a0[i] lw $t1, 0($a1) # $t1 <-- a1[i] mul $a3, $t0, $t1 add $v0, $v0, $a3 # res <-- res + a0[i] * a1[i] addi $t3, $t3, 1 # i++ b ip1 # cierra bucle (salto incond. a ip1) ipx: jr $ra # retorna al invocador