【发布时间】:2013-04-29 17:52:23
【问题描述】:
这都是相关的,我试图尽可能合乎逻辑地将它们拼凑在一起,所以请多多包涵。
我真的很困惑如何正确处理标签。比如下面这段代码,“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。
【问题讨论】:
标签: assembly mips labels addressing machine-language