我必须为项目编写一些ARM Cortex-M0汇编代码并遇到一个我似乎无法解决的问题/弄清楚它为什么会发生 . 有一条指令以某种方式使程序崩溃,如果我将它注释掉,函数返回,否则它会挂起 .

这是破坏我早晨的代码行:

/* Get start address: preceded by 8 backup, 3 state, 1 addr reg. */
ldr r0, [sp, #(4 * 11 + 4)]

那么,我从当前堆栈指针值到r0的偏移量为48个字节 . ARM instruction set manual必须说以下关于 LDR Rt, [<Rn | SP> {, #imm}]

  • Rt和Rn必须仅指定R0-R7 .
    对于LDR和STR,

  • imm必须介于0和1020之间,并且整数倍为4,使用SP作为基址寄存器

  • 计算的地址必须可以被事务中的字节数整除,请参阅地址对齐 .

显然,满足所有这三个要求(偏移量48可被4整除,单词的长度以字节为单位) .

试图找到解决这个问题的方法,我在某个方面得到了以下代码:

add sp, #48
ldr r0, [sp]
sub sp, #48

不幸的是,这也不起作用 . 在"fixes"之上的段中注释 ldr 指令(在函数返回的意义上,当然结果都是错误的) .

我正在使用的gcc版本是:

gcc版本4.7.3 20121207(发布)[ARM / embedded-4_7-branch revision 194305](适用于ARM嵌入式处理器的GNU工具)

我的构建命令是:arm-none-eabi-g -Wall -std = c99 -mlittle-endian -mcpu = cortex-m0 -march = armv6-m -mthumb -ffunction-sections -fdata-sections -Wl, - gc -sections -I -DSTM32F0XX -DUSE_STDPERIPH_DRIVER -Os -MMD -MT build / release / assembly-code-arm.o -MF build / release / assembly-code.d -c -o build / release / assembly-code.o src /assembly-code.S

有没有人知道可能导致这个问题的原因以及如何解决这个问题?