Asm 程序...出了点问题

Posted

技术标签:

【中文标题】Asm 程序...出了点问题【英文标题】:Asm program... something goes wrong 【发布时间】:2015-01-23 08:17:10 【问题描述】:

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

例子:

输入:数组1:[1 2 3 4 5] 数组2:[2 6 1]

输出:数组3:[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

【问题讨论】:

为什么sum函数是递归的?迭代解决方案会更简单、更高效。 【参考方案1】:

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

【讨论】:

以上是关于Asm 程序...出了点问题的主要内容,如果未能解决你的问题,请参考以下文章

facebook 帐户工具包 - 返回错误“我们很抱歉,出了点问题。”在安卓中

条纹结帐:出了点问题

出了点问题,请从 BotFramework MessagingExtesion 重试

一个关于verilog 状态机的问题程序,综合的时候出了点错误,希望各位可以帮忙解决下问题

在 Firebase 电话身份验证上显示错误弹出窗口“出了点问题,请重试”

Spotify 中的错误。出了点问题,请重试或查看我们的帮助区