2014-04-05 1238 views
0

如果Loop的地址是0x00,最后一条指令的编码是什么?什么是bnez MIPS指令的编码?

Loop: 
    addu $a0, $0, $t0 
    ori $v0, $0, 4 
    syscall 
    addi $t0, $t0, -1 
    bnez $t0, Loop 

最后这个指令等同于:

bne $t0, $0, Loop 

但是,我怎么会写这样的机器代码?

这是怎么了我:

000101 01000 00000 iiiii iiiii iiiiii 

我不知道,但对于我在这里什么。 Loop的地址是0x00,但是这是一个17位的二进制数。我只有16位

回答

0

MIPS中的分支与偏移一起工作(左移2位),而不是绝对地址。

BNE - 科上不等于

说明:

分行,如果两个寄存器不等于

操作:

如果$ S = $ T advance_pc! (抵消< < 2)); else advance_pc(4);

语法:

BNE $ S,$ T,抵消

编码:

0001 01ss SSST TTTT IIII IIII IIII IIII

Source

所以这是Loop偏离应该去的BNE指令在i部分,而不是其绝对地址。


EDIT:用编辑问题代码:

Loop: 
    addu $a0, $0, $t0 
    ori $v0, $0, 4 
    syscall 
    addi $t0, $t0, -1 
    bnez $t0, Loop 

由于所有MIPS指令是32位宽(4个字节),我们可以计算容易偏移:

  • Loop地址是来自BNEZ指令的-4条指令,所以它是-4 x 4 = -16字节。
  • 但是我们需要再增加一个单词,因为在MIPS PC中已经增加了4,当BNEZ执行时,PC已经指向下一条指令(参见delay slot in MIPS)。所以最终的偏移量是-20 = - (0x14)= 0xFFFEC。
  • 我们右移2位(除以4),以获得在(而不是字节)这个偏移:0xFFFEC >> 2 = 0xFFFB

您也可以通过直接的话计数做到这一点:

  • Loop地址是从BNEZ指令-4指令
  • 附加-1,因为PC已经递增:-5
  • -5 = - (0x5的)= 0xFFFB

所以我们得到0xFFFB为i部分;所以整个指令是0x1500FFFB

顺便说一下,您可以用任何MIPS汇编程序或simulator来检查此内容。

(截图来自火星模拟器)

MARS simulator, Text segment view

+0

你能告诉我该循环偏移会是什么?你能显示完整的编码,所以我可以跟着/确认你在告诉我什么? – user14864

+0

这会是机器码吗? 000101 01000 00000 0100100011010001 – user14864

+0

我不知道确切的编码,因为我不知道环路和BNE地址。 – m0skit0