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
