我有以下指令:
5ff1aed4 bl sub_5ff171d0
组装成:
FCF77CF9
这似乎意味着程序向后分支,但是当我尝试反汇编指令时,我似乎无法找到它添加到 PC 上的偏移量:
OP H Offset
1111 1 00101111100 // Low - 17C
1111 0 11111111100 // High - 7FC
这显然是不正确的,因为它增加了程序计数器的大小而不是减少它。谁能解释我哪里出错了?
我有以下指令:
5ff1aed4 bl sub_5ff171d0
组装成:
FCF77CF9
这似乎意味着程序向后分支,但是当我尝试反汇编指令时,我似乎无法找到它添加到 PC 上的偏移量:
OP H Offset
1111 1 00101111100 // Low - 17C
1111 0 11111111100 // High - 7FC
这显然是不正确的,因为它增加了程序计数器的大小而不是减少它。谁能解释我哪里出错了?
当你组装它时,你最终得到了字节:
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)