2016-05-12 89 views
0

鉴于此代码:翻译MIPS汇编为机器代码:BNE

[0x00000000] arraycopy: lw $t0, 0($a0) 
[0x00000004]    addi $a0, $a0,4 
[0x00000008]    addi $a1, $a1,4 
[0x0000000C]    sw $t0, -4($a1) 
[0x00000010]    bne $t0,$0,arraycopy 
[0x00000014]    Nop (means no operation) 

现在我感兴趣的bne命令行机器代码翻译:

什么我: 0001 0100 0000 1000 - ....

现在剩下的命令是什么?

**更新:我不断收到该偏移值:1111 1111 1110 1100是-20 但是,正确的答案应该是:0xfffb这是-5

任何想法,为什么**

回答

1

因为? MIPS指令必须对齐以4个字节边界,所述分支指令内的偏移可以被编码[和编码]作为偏移和一个字节偏移量。这增加了分支的可达范围4倍[一件好事]。因此,对于16位的带符号编码偏移量,可以得到18位的有符号字节偏移量。因此,对于给定的字节偏移量,它通过将其右移2 [即低位两位必须是总是为零,所以不会丢失]。当执行指令时,硬件将采取偏移和由2

的字节偏移量恢复到一个字节通过移位它离开偏移从分支本身(0x00000010)的地址计算不从(0x00000014)之后的指令地址。

所以,字节偏移量是-0x00000014(十进制-20) - > 0xFFFFFFEC。将此右移2位[除以4]产生0xFFFFFFFB(十进制-5)。

由于编码偏移量只是一个有符号的16位,我们最终得到0xFFFB