C LDMIA指令导致寄存器数据损坏

C LDMIA指令导致寄存器数据损坏,c,gcc,assembly,gdb,cortex-m3,C,Gcc,Assembly,Gdb,Cortex M3,我正试图在ARM Cortex-M3裸机上运行编译程序。在系统到达应用程序代码之前,一个奇怪的错误会将程序计数器吹走,并将错误清除 在发出指令之前,应观察寄存器: r0 0x0 0 r1 0x1 1 r2 0x0 0 r3 0x2 2 r4 0x18564 99684 r5 0x18418 99352 r6 0x0

我正试图在ARM Cortex-M3裸机上运行编译程序。在系统到达应用程序代码之前,一个奇怪的错误会将程序计数器吹走,并将错误清除

在发出指令之前,应观察寄存器:

r0             0x0  0
r1             0x1  1
r2             0x0  0
r3             0x2  2
r4             0x18564  99684
r5             0x18418  99352
r6             0x0  0
r7             0x0  0
r8             0x8311   33553
r9             0x0  0
r10            0x0  0
r11            0x0  0
r12            0xc84404 13124612
sp             0x7ffe0  0x7ffe0
lr             0x80df   32991
pc             0x8380   0x8380
以下指令名义上执行:

0x829c <__call_exitprocs+112>:  ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
我读过,但这似乎不是我在这里面临的直接问题。不指定一次快速读取的内部寄存器数量限制

关于这个问题有什么想法吗?如果可能的话,在gcc中有一个解决方法来防止它?

说明(及其效果)是绝对正确的。但是此指令之前的
sp
是绝对错误的。您的芯片在该地址上没有RAM内存。事实上,这个地址可能根本没有内存。请参阅手册第32页(带内存映射)


您的
sp
应该位于SRAM中的某个位置,因此高于
0x20000000
。您拥有的值-
0x7ffe0
位于“启动内存”区域的某个位置。如果要查找问题,请找出
sp
具有无效值的原因。

ldmia
从堆栈加载,但尚未显示堆栈上的内容。如果堆栈上的数据已损坏,则该指令可能运行正常。thumb指令不允许有那么多寄存器,但thumb2(armv7m)扩展允许。反汇编程序假设这就是文本的来源,否则就不会显示所有这些寄存器。正如你自己指出的,pc是坏的,因此ldmia正在修改pc,而Jester指出的pc可能在堆栈上是坏的。在指令之前转储堆栈并查看它包含的内容。在指令之前,只有
sp 0x7ffe0
是重要的,不确定为什么要发布其他寄存器。您不想改为“推到堆栈”
stmia
?如果没有,那么前面的代码必须已经在堆栈中放入足够的值。
...
r3             0x2  2
r4             0xffffffff   4294967295
r5             0xffffffff   4294967295
r6             0xffffffff   4294967295
r7             0xffffffff   4294967295
r8             0xffffffff   4294967295
r9             0xffffffff   4294967295
r10            0xffffffff   4294967295
r11            0x0  0
...
pc             0xfffffffe   0xfffffffe