【问题标题】:MIPS label addressing?MIPS 标签寻址?
【发布时间】: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。

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

我知道您将地址向左移动了 2 位,但我仍然很困惑。如果末尾没有两个 0,您是否只向左移动,例如第二个 loopend

我最迫切的问题是:0000000000000001,loopend的地址,到底是从哪里来的?我以为标签loopend 的地址应该是0000000000100000。

【问题讨论】:

    标签: assembly mips labels addressing machine-language


    【解决方案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                     |
    |_____________|_____________________________________________________________|
    

    对于第一个 bne,偏移量为 1,因此 1

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

    对于第二个 bne,偏移量是 b1111111111111011,符号扩展它的 -5 所以 -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
    

    【讨论】:

    • 非常感谢,这对您很有帮助!
    • 这个方法和跳转指令一样吗?例如:j 循环结束
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2013-04-08
    • 2018-12-02
    • 2018-03-26
    • 2013-11-05
    相关资源
    最近更新 更多