我已经阅读了大部分 ARM 文档,但在解码 BLX 指令时仍然遇到问题。下面是两个例子:
__text:0000347C 02 F0 B2 ED BLX _objc_msgSend
__text:0000469C 01 F0 A2 EC BLX _objc_msgSend
这两个应该去同一个地方,虚拟地址 0x5FE4,如下所示:
__symbolstub1:00005FE4 38 F0 9F E5 LDR PC, =__imp__objc_msgSend
但是,我无法弄清楚使用指令字节从上述两个地址(0x347C 和 0x469C)获取的计算结果。根据 ARM 文档,它应该是相对跳跃,使用右移 2,但数字不起作用。
有人可以帮忙吗?
首先,指令被打印为两个小端 16 位字段。为了匹配 ARM 参考手册中的字节顺序,您需要对每个字段进行字节交换。对于第一条指令,给出:
F0 02 ED B2
or
11110000000000101110110110110010.
这是 BLX 指令的编码 T2。将其分解为 ARM 中标识的字段:
11110 0 0000000010 11 1 0 1 1011011001 0
S imm10H J1 J2 imm10L
然后按照字段解释的说明进行操作:
I1 = NOT(J1 EOR S) = 0
I2 = NOT(J2 EOR S) = 0
imm32 = SignExtend(S:I1:I2:imm10H:imm10L:00)
= SignExtend(0000000000010101101100100)
= 0x00002b64
这正是0x5FE4 - 0x3480
(记住,PC
在 Thumb/Thumb 2) 中超前 4 个字节。
我相信您可以自己完成第二个示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)