2013-02-23 46 views
3

我不斷得到'otool'所示方法的實現地址的1個字節的偏移量。從armv7的otool錯誤的方法實現地址?

有關示例 'otool -o' 給出0xe99d5但 'otool -tvV' 給出:

+[NSError(SomeCategory) someMethod]: 
000e99d4   b590  push {r4, r7, lr} 
000e99d6  f6441184  movw r1, 0x4984 
000e99da   af01  add  r7, sp, #4 
000e99dc  f2c0010a  movt r1, 0xa 

所以方法開始於0xe99d4。 0xe99d5看起來不對,不對齊。 我相信'otool'工作正常,我不瞭解某些方面的實施。 如何解釋輸出?

回答

5

現代ARM內核有兩種類型的指令集。原來的模式稱爲arm模式,其中每個指令長度爲4個字節,較新的一個稱爲thumb2(您可以猜到它已經通過一些迭代),其中指令可以是兩個或四個字節長(引入的原因是代碼密度) 。

CPU在分支時可以改變模式,並且通知CPU關於使用的指令集的方式是通過設置要被跳轉的指令的地址中的最低有效位。如果它是0,則指令將被解釋爲arm模式,如果它是1,則它們將被解釋爲thumb模式。

所以你看到的是你的功能是在thumb2模式,我們可以通過看到它包含兩個和四個字節長的指令來驗證。

+0

很好的回答!謝謝! – 2013-02-23 20:50:36