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?
我相信ARM需要對齊指令的地址,所以'080003b5'肯定是不正確的。但最不重要的位可能用於thumb/full32模式標記(您的地址可能意味着重置處理程序是在「080003b4」處的「thumb」代碼),無法回想它是如何從頭開始的,而且我不打算檢查CPU文檔,所以採取是一個模糊的提示,這可能是完全錯誤的。 – Ped7g
這裏多次以各種形式提出這個問題,隨時搜索最合適的副本(我現在沒有時間)。簡而言之,請閱讀Thumb符號/代碼地址在互操作方面的工作方式。 – Notlikethat
當你使用跳轉指令B時,它需要知道它是跳轉到Thumb還是ARM指令,奇數地址是讓它知道它是Thumb。無論如何,LSBit在獲取跳轉地址時都會被忽略。 –