我正在编写一个带三个参数的函数。 $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)
答案 0 :(得分:1)
add $t6 , $t6 , $a1
是t6 = t6 + a1
,但这是您第一次使用t6
,因此它的值未定义(幸运的是导致" out of范围"当你尝试在那里写一个字节时,如果它偶然会在一些可写内存中结束,你会收到错误的结果加上一些随机的内存被覆盖,导致很可能在其他地方出现各种奇怪的行为。)
你也会在循环的每个循环中add
执行此操作(将a1
地址添加到先前设置的t6
),所以在第二个循环中你将会离开,即使你愿意将t6
设置为零。
对于零输入,您只需跳过即可完成,但不要将单个'0'
字符存储到数组中,t6
和t3
都不会被初始化(但已使用)
完成la v1,(t3)
会读取内存吗?我认为您只想将t3
复制到v1
?所以使用来自寄存器的加载(不确定mips助记符,我从未学过mips asm)。
您没有使用t0
。
通过在循环中将数字除以10,您可以向后获取数字,但看起来像是逐渐填充数组。
总的来说,看起来你已经掌握了应该做的事情,但是立即开始发出指示。停一会儿,将算法分成几个简单的步骤,用代码作为整行注释,然后通过它们进行各种棘手的输入(0,1,10,max_positive_int)并确保逻辑正常(Rubber duck programming )。在步骤下做出额外的注释,它们需要哪些值,尝试简化它,记录必须初始化的注释,并为它们分配寄存器。
然后其余的只是为这些步骤编写指令,并在调试器中调试它以验证一切是否按预期工作。
顺便说一句,从您的问题来看,您似乎并不打算在调试器中运行它甚至一次。那不是汇编编程的工作方式,特别是如果你只是在学习。这也使你有资格获得质疑(在提出要求之前没有表现出足够的努力),虽然我不在乎,但我宁愿低估那些没有努力去理解答案的人......:D