1

私は助けが必要です。このコードは MARS で作成しました。ユーザーから整数を受け取り、それを HEX に変換することになっています。私は何時間もそれを調べてきましたが、私が見る限り、うまくいくはずです。これは機能していない唯一の部分であるため、プログラムのループ部分と出力部分のみを含めました。誰かがコードが間違っている場所を指摘できますか? ありがとうございました。

PSビットごとのANDを台無しにしていると思います。これを使用して下位ビットをマスクしましたが、何らかの理由で、ANDではなくADDのように見えます。:-(

   li $s1, 8                    # Set up a loop counter

ループ:

   rol $s0, $s0, 4              # Roll the bits left by four bits - wraps highest bits to lowest bits (where we need them!)

   and $t0, $s0, 16           # Mask off low bits (logical AND with 000...01111)
   slti $t1, $t0, 10          # Determine if the bits represent a number less than 10 (slti)
   bne $t1, $zero, MakeLowDigit  # If yes (if lower than 9), go make a low digit

MakeHighDigit:

   subi $t0, $t0, 10            # Subtract 10 from low bits
   addi $t0, $t0, 64             # Add them to the code for 'A' (65), becomes a..f
   j DigitOut

MakeLowDigit:

   addi $t0, $t0, 47             # Combine it with ASCII code for '0', becomes 0..9 

桁アウト:

    move $a0, $t0               # Output the ASCII character
    li $v0, 11
    syscall

    subi $s1, $s1, 1            # Decrement loop counter
    bne $s1, $zero, Loop        # Keep looping if loop counter is not zero
4

2 に答える 2

4

あなたは少なくとも間違った定数でマスキングしています:

and $t0, $s0, 16               # Mask off low bits (logical AND with 000...01111)

整数 16 のビットパターンは です...010000。つまり、4 つの 1 で終わることはほとんどありません。15、つまり 16 - 1 が必要です。

一般に、n ビットが設定された右揃えビットマスクを作成するには、2 n -1 を計算する必要があります。これは、C 表記では(1 << n) - 1です。

于 2009-09-15T12:26:15.697 に答える
3

間違った定数をローリングすることに加えて、ASCII 値が正しく設定されていません。ASCII の 'A' は数字 65 で表されます。コードでは、ローリング マスクの結果に 64 を追加しています。最後の 4 ビットが 10 (10 進数) の場合、つまり $t0 に 10 進数の 10 が含まれている場合、コードは $t0 から 10 を減算します。したがって、$t0 の 10 進数の結果は 0 になります。これに 64 を追加すると、コードは @ 文字の ASCII 値を取得します。

http://www.asciitable.com/

于 2013-09-13T20:54:56.273 に答える