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

3

我已经阅读了大量的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位,但数字不匹配。

有人能帮忙吗?

1个回答

7

首先,指令被打印成两个小端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(请记住,在Thumb/Thumb2中,PC比实际地址多了4个字节)。

我相信您自己可以处理第二个例子。


1
非常感谢Stephen提供的详细解释!我在这里找到了我所缺失的文档:http://www.scribd.com/doc/74005114/21/Format-19-long-branch-with-link - Locksleyu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接