2016-05-12 88 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