2010-10-12 250 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

相關問題