Asm 程序...出了点问题

Asm program... something goes wrong

我加载了两个数组。我必须 return 第三个数组,它包含两个数组的总和并且具有较小的维度。打印最后一个。

示例:

INPUT: Array1: [1 2 3 4 5] Array2: [2 6 1]

OUTPUT: Array3: [3 8 4]

程序运行...它给了我确切的元素数,但每个元素都是 0。

.data
vett1: .word 0:100  
vett2: .word 0:100          
vett3: .word 0:100  
x: .word 0 
space: .asciiz " "  

.text
.globl main

main:

la $a0, vett1           
la $a1, vett2       
la $a2, vett3       
la $a3, x
li $t0, 0       
li $t1, 0       
li $t2, 0       
jal loadA1  #mi salvo 26 salto a caricavettore1
jal loadA2  #mi salvo 27 salto a caricavettore2
jal lenght  #mi salvo 28 salto a controllalunghezza
lw $t2, ($a3)
lw $t3, ($a3)
la $a0, vett1
la $a1, vett2
la $a2, vett3
jal summ
jal print
li $v0, 10
syscall

loadA1:
li $v0, 5
syscall
beq $v0, -1, exit
sw $v0, ($a0)
addi $t0, $t0, 1
addi $a0, $a0, 4
j loadA1
exit: jr $ra

loadA2:
li $v0, 5
syscall
beq $v0, -1, exit2
addi $t1, $t1, 1
sw $v0, ($a1)
addi $a1, $a1, 4
j loadA2
exit2: jr $ra

lenght:
blt $t0, $t1, cond1 
sw $t1, ($a3)       
jr $ra          
cond1:  sw $t0, ($a3)
jr $ra

summ:
subi $sp, $sp, 4    
sw $ra, 0($sp)      
bnez $t2, rec       
j exit3

rec:    lw $s0, ($a0)
lw $s1, ($a1)       
add $v0, $s0, $s1   
sw $v0, ($a2)       
addi $a0, $a0, 4    
addi $a1, $a1, 4    
addi $a2, $a2, 4 
subi $t2, $t2, 1    
jal summ

exit3:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra

print:
beqz $t3, exit4     
lw $a0, ($a2)       
li $v0, 1
syscall
la $a0, space
li $v0, 4
syscall
addi $a2, $a2, 4
subi $t3, $t3, 1
j print
exit4: jr $ra

当您对两个数组求和时,在每次迭代结束时将 4 添加到 $a2 以将其指向 vett3 的下一个元素。所以求和完成后$a2会在vett3.
结束后指向第一个内存位置 然后您调用 print 但不将 $a2 重置为指向 vett3 的开头,因此您最终会打印垃圾数据(可能恰好全为零 - 或者大部分为零至少,因为 xspace 会在那里)。