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 的右移,但数字不起作用。

任何人都可以帮忙吗?

4

1 回答 1

7

首先,指令被打印为两个 little-endian 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 个字节)。

我相信您可以自己完成第二个示例。

于 2012-01-18T18:22:32.260 回答