2013-04-29 42 views
1

这一切都是相关的,我试图尽可能合理地把它拼在一起,所以请耐心等待。MIPS标签寻址?

我真的很困惑如何正确解决标签。例如,在下面的代码位,“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.

回答

4
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 < < 2 = 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) 

递增对于第二BNE偏移为b1111111111111011,符号扩展其-5所以-5 < < 2 = -20,所以你递增程序计数器由 - 20个字节或减少20个字节。由于字的大小是32位,电脑减少了五个指令

.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 
+0

非常感谢,这是非常有帮助的! – Laurence 2013-05-14 07:41:14