这都是相关的,我试图尽可能合乎逻辑地将它们拼凑在一起,所以请多多包涵。
我真的很困惑如何正确处理标签。比如下面一段代码中,“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
?
我最紧迫的问题是:00000000000000001,地址loopend
,甚至在第一个bne机器语言翻译中来自哪里?我以为标签的地址loopend
是 0000000000100000。