MIPS标签寻址?

时间:2013-04-29 17:52:23

标签: assembly mips labels addressing machine-language

这一切都是相关的,我尽可能在逻辑上将它们拼凑在一起,所以请耐心等待。

我对如何正确处理标签感到困惑。例如,在下面的代码中,“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:

当我向上移动时,“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。

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

我知道你将地址转移到左边2位,但我仍然很困惑。如果最后没有两个0,你只会向左移动,比如第二个{​​{1}}?

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

1 个答案:

答案 0 :(得分: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                     |
|_____________|_____________________________________________________________|

对于第一个,偏移是1,所以1 <&lt;&lt;&lt; 2 = 4所以你将程序计数器增加4个字节。由于字长为32位,因此pc增加一条指令

.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)

对于第二个偏移,偏移是b1111111111111011,符号扩展为-5,因此-5&lt;&lt; 2 = -20所以你将程序计数器递增-20字节或递减20字节。由于字大小为32位,因此pc减少了5条指令

.text
    la $a0, opOne   
    lw $a0, 0($a0)
loopend:                  # 
    la $a1, opTwo         # 5 to here
    lw $a1, 0($a1)        # 4 ^
    add $t0, $zero, $a0   # 3 |
    addi $t1, $zero, 1    # 2 |
    bne $t1, $a1, loopend # 1 |
    addi $t1, $t1, 1      # decrement by 5 instructions