-1

割り当て用の簡単なコードスニペットを書いていますが、10進数を2進数、8進数、16進数に変換する必要があります。私はそれを機能させていますが、使用しているアルゴリズムのために、2進数を逆方向に出力していることに後で気付きました。私が使用していた戦略は、一度に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

各桁をラベル付きの文字列に格納し、その後各桁を連結してから、文字列を逆方向に読み取る方法はありますか?たぶん、あなたが私に指摘できるかもしれないより良い提案があるかもしれません。

この時点で、コードは一度に1桁の2進数を出力することで機能しますが、必要な順序とは逆であることに注意してください。このプログラムは大きな数(20桁の2進数など)を処理できるはずなので、各桁を独自のレジスタに格納することはできません。皆さんありがとう!

4

1 に答える 1

0

計算された値をメモリに保存し、逆方向に読み取って印刷することができます。予備のレジスタを 1 つ使用して (印刷するために) 桁のオフセットをバッファに保持します。たとえば、$a1 とします。メモリ アドレス 0x1000 から始まる桁を格納するとします。次に、syscall で数字を出力する代わりに、次のように保存します。

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 に答える