2

我有一些我试图在 Cortex M3 上运行的 ARM 代码。我的大部分代码都是用 Thumb 编写的,从 C 编译而来——但对于某些功能,我希望能够运行普通的 ARM 代码(据我了解,这在 M3 上是可能的吗?)。

所以...

原始 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 中逐步执行此操作,即使地址包含正确的数据,它也会在到达显示的行时立即发生 HardFaults。

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

该代码(使用 BLX)非常适用于 Thumb 代码......

知道发生了什么吗?谢谢!

4

1 回答 1

5

Cortex-M 处理器不支持 ARM 模式指令。它们仅支持 Thumb-2,其中包括 16 位和 32 位指令的混合。无法在 Cortex-M 上运行 ARM 指令。

于 2014-04-10T20:47:31.107 回答