[英]Translating Mips assembly to machine code: 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
知道為什么嗎?**
因為MIPS指令必須對齊到4個字節的邊界,分支指令中的偏移量可以被編碼[和被編碼]作為一個字的偏移,而不是一個字節偏移量。 這將分支的可達范圍增加了4倍[一件好事]。 因此,對於16位的帶符號編碼偏移量,您將獲得18位的帶符號字節偏移量
因此,對於給定的字節偏移,通過將其右移2來在分支中進行編碼(即,低兩位必須始終為零,因此不會丟失任何內容)。 執行該指令時,硬件將獲取偏移量並將其左移2位,將其恢復為字節偏移量。
字節偏移的計算不是根據分支本身的地址(0x00000010),而是根據后續指令的地址(0x00000014)。
因此,字節偏移量為-0x00000014(十進制-20)-> 0xFFFFFFEC。 向右移2位(除以4)將產生0xFFFFFFFB(十進制-5)。
由於編碼的偏移量只有16位有符號,因此我們以0xFFFB結尾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.