我正在尝试将十六进制转换为二进制。我现在卡住了。存储咬合会返回错误"地址超出范围"。这是我的代码:
.data
Input: .word 0x12345678
buff: .space 40
la $a0, Input
la $a1, buff
.text
move $t2, $a0
li $t1, 0
Loop:
rol $t2, $t2, 1
and $t0, $t2, 1
add $t0, $t0, 48
move $a0, $t0
li $v0, 11
syscall
sb $a1, 0($a0) # Runtime exception at 0x00400228: address out of range 0x000000030
subi $t1, $t1, 1
bne $t1, 32, Loop
jr $ra
我发现在编译期间,Mips将十六进制转换为十进制形式,这意味着0x12345678应该更改为305419896然后此代码应输出二进制值00010010001101000101011001111000。相反,我得到00010000000000010000000000000000的输出。如果我可以得到帮助弄清楚为什么我的地址超出范围以及为什么我的十六进制在编译期间似乎没有改变到正确的小数,这将是非常值得赞赏的。谢谢。
更新:
我已将move $t2, $a0
更改为lw $t2, 0($a0)
。现在我能够获得正确的二进制表示。但是,我仍然在我的某人行上收到超出范围错误的地址。
答案 0 :(得分:1)
您的地址超出范围,因为您正在访问错误的注册表。
sb $a0, 0($a1)
会将字节(48)存储到内存buff
。
类似地,当你应该访问内存时,指令move $t2, $a0
只是将Input
的地址从一个寄存器复制到另一个寄存器。 lb $t2, ($a0)
加载输入的第一个字节。 lw
读取一个单词,ld
读取双字。
答案 1 :(得分:0)
我发现我需要在sb行之前添加一个add。我用这个add将当前计数器添加到a0所以我可以用它作为索引来保存我的1和0。