在ARM / Thumb(IOS)上解码BLX指令

我已经阅读了许多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 

要么

 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个字节)。

我相信你可以自己完成第二个例子。

    Interesting Posts