Asm程序......出了点问题

时间:2015-01-23 08:17:11

标签: debugging assembly mips

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

示例:

  

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

1 个答案:

答案 0 :(得分:1)

当您对两个数组求和时,在每次迭代结束时将{4}添加到$a2,以将其指向vett3的下一个元素。因此,在求和完成后,$a2将指向<{em>} vett3结束后的第一个内存位置
然后你拨打print但不要重置$a2指向vett3的开头,这样你最终会打印垃圾数据(这可能恰好是全零 - 或者主要是至少为零,因为xspace将在那里。