如何计算拇指分支

逆向工程 手臂
2021-06-30 21:32:44

我有以下指令:

 5ff1aed4         bl         sub_5ff171d0  

组装成:

FCF77CF9

这似乎意味着程序向后分支,但是当我尝试反汇编指令时,我似乎无法找到它添加到 PC 上的偏移量:

OP   H  Offset
1111 1 00101111100 // Low - 17C 
1111 0 11111111100 // High - 7FC 

这显然是不正确的,因为它增加了程序计数器的大小而不是减少它。谁能解释我哪里出错了?

1个回答

当你组装它时,你最终得到了字节:

FC F7 7C F9

这是两个 16 位小端拇指指令:

fc f7 = 0xf7fc = 111 10 11111111100 = BL, H=10, offset_hi=0x7fc
7c f9 = 0xf97c = 111 11 00101111100 = BL, H=11, offset_lo=0x17c

为了计算BL的目的地址,pc是:

pc = address of first BL instruction + 4 = 0x5ff1aed8 

对于目的地的计算:

dest = pc + (sign_extend(offset_hi)<<12) + (offset_lo<<1)
     = pc + (0xfffffffc<<12) + (0x17c<<1)
     = 0x5ff1aed8 + 0xffffc000 + 0x2f8 
     = 0x5ff171d0 (result is only 32bits wide)