2014-04-10 66 views
2

我試圖在Cortex M3上運行一些ARM代碼。我用Thumb編寫的大部分代碼都是用C語言編寫的 - 但對於某些函數,我希望能夠運行正常的ARM代碼(據我瞭解,這在M3上是可行的)。Cortex M3上的非Thumb ARM代碼

所以......

原來的C代碼和彙編:

int donothing(int a) { 
    return a; 
} 


00000068 <donothing>: 
    68: e52db004 push {fp}  ; (str fp, [sp, #-4]!) 
    6c: e28db000 add fp, sp, #0 
    70: e24dd00c sub sp, sp, #12 
    74: e50b0008 str r0, [fp, #-8] 
    78: e51b3008 ldr r3, [fp, #-8] 
    7c: e1a00003 mov r0, r3 
    80: e28bd000 add sp, fp, #0 
    84: e8bd0800 ldmfd sp!, {fp} 
    88: e12fff1e bx lr 

使用arm-none-eabi-gcc -mfloat-abi=soft -nostdinc -nostdlib

我支到這個與blx r4編譯 - 如果基址應交換& 3 0 ,它是。

儘管地址包含正確的數據,但一旦到達所顯示的行,它就會在GDB中逐步完成此操作。

(gdb) p/x *0x2000934c 
$2 = 0xe52db004 

代碼(與BLX)完全適用,雖然Thumb代碼...

任何想法是怎麼回事?謝謝!

+5

M3沒有ARM模式。它支持Thumb-2指令集,其中包含一些32位指令(請參閱http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf) – Michael

+0

該建議適用於[整個* Cortex- M *系列](http://en.wikipedia.org/wiki/ARM_Cortex-M)。那裏給出了每個* Cortex-M *變體支持的特定指令。全是* Thumb/Thumb2 *;即,他們執行CPSR位5被設置。 –

+0

顯而易見的問題是_why_?除了ARM ISA的更深奧的角落之外,大多數ARM彙編代碼都應該進行最小的調整轉換,除非過度使用條件執行(即使在現代內核的ARM模式下也不是最優的)。對於編譯的代碼,指令集應該不是問題。不可否認,M3是Thumb-2的一個子集,但它只是真正缺少DSP的東西。 – Notlikethat

回答

5

Cortex-M處理器不支持ARM模式指令。它們僅支持Thumb-2,其中包含16位和32位指令的混合。無法在Cortex-M上運行ARM指令。