MIPS 汇编:从整数转换为十六进制 [英] MIPS Assembly: Convert from Integer to Hexadecimal

查看:87
本文介绍了MIPS 汇编:从整数转换为十六进制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I found this code snippet that I believe converts an integer to hex. However, I'm not following it at all. I added the comments that say what I believe is happening, but I have no idea WHY it's being done. So, assuming I correctly noted what each line was doing, can someone please explain to me why it's being done? As in how it in any way helps convert to hex?

$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

推荐答案

    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 使用分支延迟槽,这意味着分支指令之后的指令总是在分支被执行(或不被执行)之前执行.

MIPS uses branch delay slots, meaning that the instruction following the branch instruction always is executed before the branch is taken (or not taken).

所以这就是如果 $t0 小于 10(即在 0..9 范围内),转到 DIGIT,但首先添加 48(ASCII '0'),不管 $t0 的值如何.如果分支已被采用,您现在将从 0..9 转换为 '0'..'9'.如果未采用分支,$t0 最初在 10..15 范围内,现在将在范围 58..63,所以我们再添加 39 以获得范围 97..102 中的值('a'..'f' 的 ASCII 代码)".

So what this says is "If $t0 is less than 10 (i.e. in the range 0..9), goto DIGIT, but first add 48 (ASCII '0') regardless of the value of $t0. In case the branch was taken you'll now have converted from 0..9 to '0'..'9'. In case the branch wasn't taken, $t0 was originally in the range 10..15 and will now be in the range 58..63, so we add 39 more to get a value in the range 97..102 (the ASCII codes for 'a'..'f')".

这篇关于MIPS 汇编:从整数转换为十六进制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆