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代碼...
任何想法是怎麼回事?謝謝!
M3沒有ARM模式。它支持Thumb-2指令集,其中包含一些32位指令(請參閱http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf) – Michael
該建議適用於[整個* Cortex- M *系列](http://en.wikipedia.org/wiki/ARM_Cortex-M)。那裏給出了每個* Cortex-M *變體支持的特定指令。全是* Thumb/Thumb2 *;即,他們執行CPSR位5被設置。 –
顯而易見的問題是_why_?除了ARM ISA的更深奧的角落之外,大多數ARM彙編代碼都應該進行最小的調整轉換,除非過度使用條件執行(即使在現代內核的ARM模式下也不是最優的)。對於編譯的代碼,指令集應該不是問題。不可否認,M3是Thumb-2的一個子集,但它只是真正缺少DSP的東西。 – Notlikethat