Преобразование десятичного числа в двоичное и печать в MIPS - PullRequest
0 голосов
/ 13 октября 2010

Я пишу простой фрагмент кода для назначения, и мне нужно преобразовать десятичное число в двоичное, восьмеричное и шестнадцатеричное. У меня это работает, но потом я понял, что из-за алгоритма, который я использую, я печатаю двоичное число в обратном направлении. Стратегия, которую я использовал, состояла в том, чтобы печатать одну цифру за раз. Я все еще новичок, поэтому я подумал, что это будет простой способ избежать более промежуточных вопросов. К сожалению, я не думал об этом до конца.

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 двоичных цифр), поэтому я не могу хранить каждую цифру в своем собственном регистре. Спасибо всем!

1 Ответ

0 голосов
/ 13 октября 2010

Возможно, вы захотите сохранить вычисленные значения в памяти, а затем прочитать их в обратном порядке, чтобы напечатать их. Используйте один резервный регистр, чтобы сохранить смещение цифр в буфере (для печати), скажем, $ 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

...