这一切都是相关的,我试图尽可能合理地把它拼在一起,所以请耐心等待。MIPS标签寻址?
我真的很困惑如何正确解决标签。例如,在下面的代码位,“BNE”转换为“00010101001001010000000000000001”,和loopend的标签地址是0x00000020(32)
.text
la $a0, opOne
lw $a0, 0($a0)
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
loopend:
当我移动loopend起来,“BNE”变成“00010101001001011111111111111011”和loopend的地址变为0x00000008(8)
.text
la $a0, opOne
lw $a0, 0($a0)
loopend:
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
所以从我的理解,在代码的第一位,loopend
是后八条指令,所以它的地址为4×8 = 32 = 0x00000020。在第二位代码中,loopend
在两条指令之后,所以它的地址是4 * 2或0x00000008。
但是,我不明白的是标签地址。如果我错了,请纠正我的错误:标签地址取决于标签与调用它的指令相关的位置。所以在第一位代码中,loopend
是比bne
晚两行,所以你不要翻转标志,它的地址是“0000000000000001”。在第二个loopend
之前bne
所以你翻转的标志,其地址变成“1111111111111011”。
我知道你将地址转移到左边的2位,但我仍然很困惑。如果最后没有两个0,你只能向左移动,如第二个loopend
?
我最迫切的问题是:哪里做的0000000000000001,地址loopend
,甚至来自第一个机器语言翻译?我认为标签loopend
的地址将是0000000000100000.
非常感谢,这是非常有帮助的! – Laurence 2013-05-14 07:41:14