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

ответ

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