2013-10-14 87 views
0

我发现这个代码片断,我相信将整数转换为十六进制。但是,我没有遵循它。我添加了说明我相信正在发生的意见,但我不知道为什么这样做。所以,假设我正确地注意到每一行都在做什么,请有人向我解释为什么这样做?至于它如何以任何方式帮助转换为十六进制?MIPS汇编:从整数转换为十六进制

$ 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 

回答

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码的值“。

+0

ohhh所以他将它转换为ASCII码,然后ASCII码进入每个单独的数字? – user2869231

+0

类别。最终结果是一个字符串,它只是一个(ASCII)字符数组。 – Michael

+0

啊...我不知道十六进制是一个字符串。想象它是用不同格式编写的数字。这绝对有帮助..谢谢! – user2869231