2012-01-18 53 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