2012-01-18 54 views
3

我已阅读了大部分ARM文档,但仍然无法解码BLX指令。这里有两个例子:在ARM/Thumb(IOS)上解码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,但数字不成立。

任何人都可以帮忙吗?

回答

6

首先,该指令被打印为两个小端16位字段。为了匹配ARM参考手册中的字节顺序,您需要字节切换每个字段。对于第一个指令时,给出:所述BLX指令的

F0 02 ED B2 

11110000000000101110110110110010. 

这被编码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是提前4个字节在Thumb /拇指2)。

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

+1

非常感谢Stephen的详细解释!我发现我在这里失踪的文档:http://www.scribd.com/doc/74005114/21/Format-19-long-branch-with-link – Locksleyu 2012-01-18 18:45:47