0

我发现了这个代码片段,我相信它可以将整数转换为十六进制。但是,我根本不关注它。我添加了说明我认为正在发生的事情的评论,但我不知道为什么要这样做。所以,假设我正确地记下了每一行在做什么,有人可以向我解释为什么要这样做吗?就像它如何以任何方式帮助转换为十六进制一样?

$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,但首先添加 48(ASCII '0'),无论 $t0 的值如何。如果分支是采取你现在已经从 0..9 转换为 '0'..'9'。如果没有采取分支,$t0 最初在 10..15 范围内,现在将在 58 范围内..63,所以我们再添加 39 得到一个 97..102 范围内的值('a'..'f' 的 ASCII 码)”。

于 2013-10-15T06:53:26.487 回答