0

整数を 16 進数に変換すると思われるこのコード スニペットを見つけました。しかし、私はそれをまったくフォローしていません。私が信じていることが起こっていると言うコメントを追加しましたが、なぜそれが行われているのかわかりません. それで、各行が何をしているかを正しく指摘したと仮定すると、誰かがなぜそれが行われているのか説明してもらえますか? それがどのように16進数に変換するのにどのように役立つかのように?

$a0 は整数値です

$a1 は、結果があるべきアドレスです

        addi $t0, $0, 48       #set $t0 equal to 48 
        sb $t0, 0($a1)         #store $to (48) at location 0 in $a1
        addi $t0, $0, 120      #set $t0 equal to 120
        sb $t0, 1($a1)         #store $t0 (120) at location 1 in $a1
        addi $t1, $a1, 9       #set $t1 = the address + 9

LOOP:

        andi $t0, $a0, 0xf    #$t0 = 1 if $a0 and 0xf are the same (0xf = beginning of hex)?

        slti $t2, $t0, 10     #if $t0 is less than 10, $t2 = 1, else 0
        bne $t2, $0,  DIGIT   #if $t2 does not equal 0, branch to DIGIT
        addi $t0, $t0, 48     #set $t0 equal to 48
        addi $t0, $t0, 39     #set $t0 equal to 39 (why did we just write over the 48?)
DIGIT:

        sb $t0, 0($t1)        #set $t0 equal to whatever's in location 0 of $t1

        srl $a0, $a0, 4       #shift right 4 bits

        bne $a0, $0, LOOP     #if $a0 does not equal 0, branch to LOOP
        addi $t1, $t1, -1     #set $t1 = $t1 - 1

DONE:

        jr $ra                #set the jump register back to $ra
        nop
4

1 に答える 1

1
    slti $t2, $t0, 10     #if $t0 is less than 10, $t2 = 1, else 0
    bne $t2, $0,  DIGIT   #if $t2 does not equal 0, branch to DIGIT
    addi $t0, $t0, 48     #set $t0 equal to 48
    addi $t0, $t0, 39     #set $t0 equal to 39 (why did we just write over the 48?)

MIPS は分岐遅延スロットを使用します。つまり、分岐命令に続く命令は、分岐が実行される (または実行されない) 前に常に実行されます。

したがって、これは、「$t0 が 10 未満 (つまり、範囲 0..9) の場合、DIGIT に移動しますが、$t0 の値に関係なく、最初に 48 (ASCII '0') を追加します。ブランチが取得すると、0..9 から '0'..'9' に変換されます。分岐が取得されなかった場合、$t0 は元は 10..15 の範囲にあり、現在は 58 の範囲になります..63 なので、さらに 39 を追加して、97..102 ('a'..'f' の ASCII コード) の範囲の値を取得します。

于 2013-10-15T06:53:26.487 に答える