如何使用mips在数组中存储ascii值?

时间:2016-10-05 02:09:24

标签: arrays assembly 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)

1 个答案:

答案 0 :(得分:1)

add $t6 , $t6 , $a1t6 = t6 + a1,但这是您第一次使用t6,因此它的值未定义(幸运的是导致" out of范围"当你尝试在那里写一个字节时,如果它偶然会在一些可写内存中结束,你会收到错误的结果加上一些随机的内存被覆盖,导致很可能在其他地方出现各种奇怪的行为。)

你也会在循环的每个循环中add执行此操作(将a1地址添加到先前设置的t6),所以在第二个循环中你将会离开,即使你愿意将t6设置为零。

对于零输入,您只需跳过即可完成,但不要将单个'0'字符存储到数组中,t6t3都不会被初始化(但已使用)

完成la v1,(t3)会读取内存吗?我认为您只想将t3复制到v1?所以使用来自寄存器的加载(不确定mips助记符,我从未学过mips asm)。

您没有使用t0

通过在循环中将数字除以10,您可以向后获取数字,但看起来像是逐渐填充数组。

总的来说,看起来你已经掌握了应该做的事情,但是立即开始发出指示。停一会儿,将算法分成几个简单的步骤,用代码作为整行注释,然后通过它们进行各种棘手的输入(0,1,10,max_positive_int)并确保逻辑正常(Rubber duck programming )。在步骤下做出额外的注释,它们需要哪些值,尝试简化它,记录必须初始化的注释,并为它们分配寄存器。

然后其余的只是为这些步骤编写指令,并在调试器中调试它以验证一切是否按预期工作。

顺便说一句,从您的问题来看,您似乎并不打算在调试器中运行它甚至一次。那不是汇编编程的工作方式,特别是如果你只是在学习。这也使你有资格获得质疑(在提出要求之前没有表现出足够的努力),虽然我不在乎,但我宁愿低估那些没有努力去理解答案的人......:D