Assembly MIPS标签寻址?

Assembly MIPS标签寻址?,assembly,mips,labels,addressing,machine-language,Assembly,Mips,Labels,Addressing,Machine Language,这一切都是相关的,我尽可能逻辑地把它们拼凑在一起,所以请容忍我 我真的很困惑如何正确地称呼标签。例如,在下面的代码位中,“bne”转换为“0000101001001010000000000000001”,loopend的标签地址为0x00000020(32) 当我向上移动loopend时,“bne”变为“0000101001011111111111111011”,loopend的地址变为0x00000008(8) 据我所知,在代码的第一位,loopend在八条指令之后,所以它的地址是4*8=32

这一切都是相关的,我尽可能逻辑地把它们拼凑在一起,所以请容忍我

我真的很困惑如何正确地称呼标签。例如,在下面的代码位中,“bne”转换为“0000101001001010000000000000001”,loopend的标签地址为0x00000020(32)

当我向上移动loopend时,“bne”变为“0000101001011111111111111011”,loopend的地址变为0x00000008(8)

据我所知,在代码的第一位,
loopend
在八条指令之后,所以它的地址是4*8=32=0x00000020。在代码的第二位,
loopend
位于两条指令之后,因此其地址为4*2,或0x00000008

然而,我不明白的是标签地址。如果我错了,请纠正我:标签地址取决于标签相对于调用它的指令的位置。因此,在代码的第一位,
loopend
bne
晚两行,因此不翻转符号,其地址是“000000000000000 1”。第二个
loopend
位于
bne
之前,因此您翻转符号,其地址变为“111111011”

我知道你把地址移到了左2位,但我还是很困惑。是否仅当末尾没有两个0时(如第二个
loopend
)才向左移动

我最迫切的问题是:在第一次机器语言翻译中,
loopend
的地址0000000000001从哪里来?我认为label
loopend
的地址应该是0000000000 100000

BNE -- Branch on not equal
 ___________________________________________________________________________
|Description: | Branches if the two registers are not equal                 |
|_____________|_____________________________________________________________|
|Operation:   | if $s != $t advance_pc (offset << 2)); else advance_pc (4); |
|_____________|_____________________________________________________________|
|Syntax:      | bne $s, $t, offset                                          |
|_____________|_____________________________________________________________|
|Encoding:    | 0001 01ss ssst tttt iiii iiii iiii iiii                     |
|_____________|_____________________________________________________________|

对于第二个bne,偏移量是B1111111011,符号扩展了它的-5 so-5非常感谢,这非常有用!跳转指令的方法相同吗?例如:j loopend
.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
BNE -- Branch on not equal
 ___________________________________________________________________________
|Description: | Branches if the two registers are not equal                 |
|_____________|_____________________________________________________________|
|Operation:   | if $s != $t advance_pc (offset << 2)); else advance_pc (4); |
|_____________|_____________________________________________________________|
|Syntax:      | bne $s, $t, offset                                          |
|_____________|_____________________________________________________________|
|Encoding:    | 0001 01ss ssst tttt iiii iiii iiii iiii                     |
|_____________|_____________________________________________________________|