2013-10-28 26 views
0

我有我自己的ARM asm(32位ARM/NEON)。從這個彙編代碼我稱之爲是用C實現的東西像這樣一些功能:ARM到Thumb2的互通

 ARM 

NormCorrS0_S0_S0_ PROC 
     ... 
     BL  ConvolveC4 <-- implemented in C/C++ 
     ... 

1)如果ARM-ASM意識到ConvolveC4是的Thumb2,這是什麼需要做的調用它,並切換到的Thumb2? 2)如果ARM-asm不知道ConvolveC4是什麼,那麼顯然ARM asm保持不變,但我需要在ConvolveC4端添加某種單板以確保ARM狀態正確切換。

回答

1

您必須使用BX或BLX或取決於手臂彈出(ldm)。取決於你的鏈接器,你可以像這樣離開它,鏈接器將添加一個ConvolveC4_from_arm例如基本上將鏈接寄存器設置爲bl之後的返回地址,但蹦牀切換模式。

另一種方法是,除非您在相同的來源調用函數,並且您知道模式,則始終使用blx或bx。

如果您正確聲明瞭標籤/功能,gnu工具binutils可以爲您處理一些此類問題。

+0

對於具有BLX的處理器(體系結構v5T及更高版本,包括所有帶有Thumb2的處理器),不需要鏈接器蹦牀/膠合板。在鏈接時,鏈接器知道調用者和被調用者的指令集,並可根據需要將「BL」更改爲「BLX」。 armlink這樣做;我不確定GNU LD,但我希望它也能做到這一點。 – scott

+0

不知道這個人使用什麼彙編程序和鏈接器,它可能不知道所有這些... –

+0

我使用Windows RT(從微軟)armasm。編譯器會根據呼叫的目的地自動插入bl/blx。但是,我無法弄清楚如何運行32位ARM。我對Thumb2沒有任何問題,但是使用ARM時,我得到了奇怪的錯誤......是否有可能ARM在硬件級別被禁用? – Pavel