arm跳轉指令對應的機器碼


ARM:

常見跳轉指令機器碼:

B:0xEA

BL:0xEB

偏移地址計算過程:

(目標地址 - 指令地址 - 8)/ 4 = 偏移

// 減8,指令流水造成。

// 除4,因為指令定長,存儲指令個數差,而不是地址差。

完整指令:

假設上一步得到的偏移為0x00000C

跳轉指令為:B

則完整指令為:0C 00 00 EA

 

 

THUMB:

Thumb指令都是2字節。BL看起來像4字節指令,其實是一個誤解,因為長跳轉是由兩條跳轉指令組成的。

 

 

0~11位表示11位地址,具體含義如下:

11位為0,偏移高位(off0)

11位為1,偏移低位(off1)

 

例子:

 

1.向后跳轉

 

 

0012 00F001F8   bl .Lhelo

.Lhelo:

0018 05F0D1F7   pld [r1, r5]

 

 

 

 

 

 

 

解析偏移:

 

取高位 f000, 取后11位 => 000

 

取低位 f801, 取后11位 => 001

 

計算偏移:

 

000 << 12) | (001 << 1) = 2

 

由於這個最高位符號位為0,代表向后跳轉,只需要保留該值2即可。

 

目標地址:

 

0x0012 + 4 + 2 = 0x0018

 

2.向前跳轉

 

 

00001164 FF F7 BE FF    BL _Z4testv

_Z4testv:

000010E4 07 B5        PUSH {R0-R2,LR}

 

 

 

 

 

 

 

解析偏移:

 

取高位 f7ff, 取后11位 => 7ff

 

取低位 ffbe, 取后11位 => 7be

 

計算偏移: 

 

7ff << 12) | (7be << 1) = 7fff7c

 

由於這個最高位符號位為1,代表向前跳轉,需要-1,然后取反,得到值為: ff800084,取84即可。

 

目標地址: 

 

0x1164 + 4 - 0x84 = 0x10e4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM