2016-11-28 59 views
0

我有一個小型應用程序,可以在我的ARM Cortex M4上編譯和運行。但是,當我拆開的二進制文件,我平齊,這裏是第一個字節是如何模樣:手臂向量表指向一個字節後

00000000 <.data>: 
    0: 20020000  andcs r0, r2, r0 
    4: 080003b5  stmdaeq r0, {r0, r2, r4, r5, r7, r8, r9} 
    8: 08000345  stmdaeq r0, {r0, r2, r6, r8, r9} 
    c: 08000351  stmdaeq r0, {r0, r4, r6, r8, r9} 

080003b5應復位處理程序的地址(我.word Reset_Handler有),但拆卸ELF顯示,復位處理程序實際上是位於080003b4,這是1個字節前:

080003b4 <Reset_Handler>: 
    80003b4: 2100  movs r1, #0 
    80003b6: e003  b.n 80003c0 <InitData> 

(它在Thumb模式下的運行,我有2字節指令)。

即使我拆解二進制文件,它位於080003b4:

000003b4 <.data+0x3b4>: 
    3b4: 2100   movs r1, #0 
    3b6: e003   b.n  0x3c0 

我的問題是,爲什麼它點之後1個字節?這個代碼令人驚訝地適用於實際的板子。即使不拆解,不應該用2個字節來對齊指令嗎?地址如何可以是0x000003b5?

+1

我相信ARM需要對齊指令的地址,所以'080003b5'肯定是不正確的。但最不重要的位可能用於thumb/full32模式標記(您的地址可能意味着重置處理程序是在「080003b4」處的「thumb」代碼),無法回想它是如何從頭開始的,而且我不打算檢查CPU文檔,所以採取是一個模糊的提示,這可能是完全錯誤的。 – Ped7g

+1

這裏多次以各種形式提出這個問題,隨時搜索最合適的副本(我現在沒有時間)。簡而言之,請閱讀Thumb符號/代碼地址在互操作方面的工作方式。 – Notlikethat

+1

當你使用跳轉指令B時,它需要知道它是跳轉到Thumb還是ARM指令,奇數地址是讓它知道它是Thumb。無論如何,LSBit在獲取跳轉地址時都會被忽略。 –

回答

0

答案:ARM用它切換到THUMB模式。

相關問題