簡體   English   中英

將Mips程序集轉換為機器代碼:BNE

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM