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

标签 ios assembly arm thumb

我已经通读了大部分 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,但数字不正确。

有人能帮忙吗?

最佳答案

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

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

关于ios - 在 ARM/Thumb (IOS) 上解码 BLX 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915040/

相关文章:

c++ - 在 x86_64 上非临时加载 32 位和 64 位值的 C/C++ 内在函数?

assembly - 根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?

C - 无法在 Ubuntu 上静态链接到 OpenSSL

c++ - 为 ARMHF 编译 Crypto++ 时出现链接错误

ios - 如何使用带有 AFNetworking 的 POST 将图像作为参数(参数)发送

iphone - 在iOS中,实现滑动 "drawers"的最佳方式是什么

ios - Swift Cocoa 按钮未到位

ios - AFNetworking - HTTP 加载失败(错误代码 : -999) swift iOS

gcc - 我的处理器的汇编指令集

c++ - CMAKE - 调试/交叉构建?