Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS程序集:从整数转换为十六进制_Assembly_Type Conversion_Mips - Fatal编程技术网

Assembly MIPS程序集:从整数转换为十六进制

Assembly MIPS程序集:从整数转换为十六进制,assembly,type-conversion,mips,Assembly,Type Conversion,Mips,我发现了这个代码片段,我相信它可以将整数转换为十六进制。然而,我一点也不明白。我添加了一些评论,这些评论说明了我认为正在发生的事情,但我不知道为什么会这样做。所以,假设我正确地记下了每一行正在做什么,有人能给我解释一下为什么要这样做吗?它是如何帮助转换成十六进制的 $a0是整数值 $a1是应该显示结果的地址 addi $t0, $0, 48 #set $t0 equal to 48 sb $t0, 0($a1) #store $to

我发现了这个代码片段,我相信它可以将整数转换为十六进制。然而,我一点也不明白。我添加了一些评论,这些评论说明了我认为正在发生的事情,但我不知道为什么会这样做。所以,假设我正确地记下了每一行正在做什么,有人能给我解释一下为什么要这样做吗?它是如何帮助转换成十六进制的

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


所以这里说的是“如果$t0小于10(即在0..9范围内),转到数字,但首先加48(ASCII'0')”不管$t0的值是多少。如果执行了分支,您现在将从0..9转换为'0'..'9'。如果未执行分支,$t0最初在10..15范围内,现在将在58..63范围内,因此我们再添加39以获得97..102范围内的值(“a'..'f'的ASCII代码)。”.

ohhh所以他把它转换成ASCII码,然后ASCII码进入每个数字?有点像。最终结果是一个字符串,它只是一个(ASCII)字符数组。。。我不知道十六进制是一个字符串。我想这是一个用不同格式写的数字。那肯定有帮助。。谢谢十六进制并不自动表示字符串。但是,除非涉及到文本表示,否则不同基础之间的转换没有多大意义。对于普通数字,没有区别(值20和0x14由完全相同的位模式表示)。真正的MIPS使用分支延迟槽,但MARS/SPIM不使用(我提到这一点是因为有一半的MIPS问题是关于这些模拟器的)。有趣的事实:最近对MIPS ISA的更新添加了没有分支延迟槽的新分支指令。在20世纪80年代,像这样公开管道的细节是很好的,但对于超标量/无序执行MIPS来说就不太好了,因为这会给支持带来不便。有工作代码。
    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?)