2014-04-10 68 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指令。