[英]How to store ascii values in array using mips?
我正在编写一个带有三个参数的函数。 $a0
是正int
值和$a1
是一个数组, $a3
是数组大小。 我必须将第一个参数转换为ascii十进制数字。 然后将该数字存储到数组中。 我一直这样做直到没有更多的数字可以转换。 我必须返回我存储的最后一个数组地址和最后的ascii值(将它们放在$v0
和$v1
)。 我究竟做错了什么 ?
uitoa:
li $t0 , 0
li $t1 , 10
li $t4 , 48
li $t8 , 0
for :
beq $a0,$t8,finished
div $a0,$t1
mfhi $t2 #remainder
mflo $a0
add $t3,$t2,$t4 # +48 to ascii
add $t6 , $t6 , $a1 #address of array?
sb $t3, 0($t6)
addi $t6,$t6,1 # increment array ?
addi $t0, $t0 ,1
j for
finished:
la $v0 , ($t6)
la $v1 , ($t3)
add $t6 , $t6 , $a1
是t6 = t6 + a1
,但这是第一次使用t6
,因此它的值是不确定的(幸运的是,当您尝试在其中写入字节时会导致“超出范围” ,如果它意外地以某个可写的内存结尾,您将收到错误的结果,加上一些被覆盖的随机内存,这很可能导致其他地方发生各种奇怪的行为)。
同样,您会在循环中add
每个循环(将a1
地址添加到先前设置的t6
),因此,即使您将t6
提前设置为零,也将在第二个循环中退出。
对于零输入,您只是跳到完成,但是您没有将单个'0'
字符存储到数组中,并且t6
和t3
都未初始化(但已使用)。
在完成la v1,(t3)
将读取内存吗? 我认为您打算将t3
复制到v1
? 因此,请使用来自寄存器的加载(不确定mips助记符,我从没学过mips asm)。
您可以使用t0
白白。
通过将数字除以10循环,可以得到数字倒数,但看起来好像是逐渐填充了数组。
总体来说,您似乎已经掌握了应该做的事情,但立即开始发出说明。 停一会儿,将算法分成几行简单的步骤,以整行注释的形式写在代码中,然后遍历它们进行各种棘手的输入(0、1、10,max_positive_int),并确保逻辑正常( 橡皮鸭编程 )。 在步骤下记下所需的其他注释,以简化操作,在必须初始化的地方做注释,并为其分配寄存器。
然后其余的内容仅意味着编写这些步骤的说明,然后在调试器中对其进行调试,以验证所有功能均按预期工作。
顺便说一句,从您的问题来看,您似乎甚至没有费心在调试器中运行它。 那不是汇编编程的工作原理,特别是如果您只是在学习。 这也使您有资格投票否决问题(在问之前没有表现出足够的努力),尽管我不在乎,我宁愿投票给没有表现出理解答案的人的人..:D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.