【问题标题】:MIPS Assembly: Convert from Integer to HexadecimalMIPS 汇编:从整数转换为十六进制
【发布时间】:2013-10-14 22:57:44
【问题描述】:

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

$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

【问题讨论】:

标签: assembly type-conversion mips


【解决方案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 码)”。

【讨论】:

  • 哦,所以他将其转换为 ASCII,然后 ASCII 码进入每个单独的数字?
  • 有点。最终结果是一个字符串,它只是一个 (ASCII) 字符数组。
  • 啊...我没有意识到十六进制是一个字符串。认为这是一个以不同格式编写的数字。这绝对有帮助.. 谢谢!
  • 十六进制不会自动表示字符串。但是除非涉及文本表示,否则不同基础之间的转换没有多大意义。对于普通数字没有区别(值 20 和 0x14 由完全相同的位模式表示)。
  • Real MIPS 使用分支延迟槽,但 MARS / SPIM (我之所以提到这一点,是因为关于 SO 的 MIPS 问题有一半是关于这些模拟器的)。有趣的事实:最近对 MIPS ISA 的更新添加了 没有 具有分支延迟槽的新分支指令。像这样暴露管道的细节在 1980 年代很好,但对于超标量/乱序执行 MIPS 来说不太好,因为它支持不便。
猜你喜欢
  • 2023-01-31
  • 2010-10-16
  • 1970-01-01
  • 2012-06-02
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多