-1

我正在为赋值编写一段简单的代码,我需要将十进制数转换为二进制、八进制和十六进制。我让它工作了,但后来我意识到由于我使用的算法,我向后打印二进制数。我使用的策略是一次打印一个数字。我仍然是初学者,所以我认为这将是避免更多中间问题的简单方法。不幸的是,我并没有一路想通。

binary:   la        $a0, bType                            #binary function selected, notify user
          li        $v0, 4                                #print notification
          syscall
          la        $a0, in_val                           #ask user for input decimal number
          li        $v0, 4                                #print
          syscall
          li        $v0, 5                                #syscall read int
          syscall
          move      $t0, $v0                              #save input value to $t0
          li        $t1, 2                                #load 2 into $t1 to divide by 2
          li        $v0, 4
          la        $a0, bRes                            
          syscall                                         #print result tag
binLoop:  divu      $t0, $t1                              #LO = $t0/2, HI = $t0 % 2
          mfhi      $t2                                   #$t2 = HI (remainder)
          mflo      $t0                                   #$t0 = $t0/2 (quotient)
          move      $a0, $t2                              #store digit to print
          li        $v0, 1                                #Print digit
          syscall
          bgtz      $t0, binLoop                          #if input != 0, keep dividing
          j         main

有什么方法可以将每个数字存储到带有标签的字符串中,然后将每个数字连接起来,然后向后读取字符串或其他什么?也许有更好的建议你可以指出我。

请注意,此时代码通过一次打印一个二进制数字来工作,但顺序与我们想要的相反。该程序应该能够处理大数字(如 20 个二进制数字长),所以我不能将每个数字存储在它自己的寄存器中。谢谢大家!

4

1 回答 1

0

您可能希望将计算值存储在内存中,然后反向读取它们以打印它们。使用一个备用寄存器来保存缓冲区中数字的偏移量(用于打印),例如 $a1,假设您将存储从内存地址 0x1000 开始的数字。然后,不要使用系统调用来打印数字,只需将其存储为如下所示:

sw $t2, 0x1000($a1)
addiu $a1, $a1, 4

现在,当您完成输入数据的处理后,您可以以相反的顺序遍历您创建的向量并打印每个数字:

addiu $a1, $a1, -4
lw $t2, 0x1000($a1)
# Now your code to print the digit

您必须循环直到 $a1 达到 0

于 2010-10-13T17:58:08.453 回答