2010-10-12 249 views
-1

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

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个二进制数字长),所以我不能将每个数字存储在自己的寄存器中。谢谢大家!

+0

你将不得不回路不存在任何形式的堆栈? – ruslik 2010-10-13 00:10:12

回答

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

相关问题