MIPS标签寻址?

Lau*_*nce 2 assembly mips machine-language labels addressing

这都是相关的,我尽我所能将它们拼合起来,所以请耐心等待。

我对如何正确处理标签感到非常困惑。例如,在下面的代码位中,“ 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:
Run Code Online (Sandbox Code Playgroud)

当我向上移动loopend时,“ bne”变为“ 00010101001001011111111111111111”,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
Run Code Online (Sandbox Code Playgroud)

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

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

我知道您将地址左移2位,但是我仍然很困惑。您是否仅在结尾没有两个0的情况下才向左移动,例如第二个loopend

我最紧迫的问题是:0000000000000001的地址在哪里loopend,甚至来自第一个bne机器语言翻译中?我以为标签的地址loopend是0000000000100000。

Mus*_*usa 5

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                     |
|_____________|_____________________________________________________________|
Run Code Online (Sandbox Code Playgroud)

对于第一个bne,偏移量为1,所以1 << 2 = 4,因此您将程序计数器增加了四个字节。由于字长为32位,因此pc将增加一条指令

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                     |
|_____________|_____________________________________________________________|
Run Code Online (Sandbox Code Playgroud)

对于第二个bne,偏移量为b1111111111111011,符号扩展了-5,所以-5 << 2 = -20,因此您将程序计数器增加-20个字节或将其减少20个字节。由于字长为32位,因此pc递减了5条指令

.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 # increment by 1 insruction
loopend:             # to here (well the next instruction)
Run Code Online (Sandbox Code Playgroud)