C LDMIA指令导致寄存器数据损坏
我正试图在ARM Cortex-M3裸机上运行编译程序。在系统到达应用程序代码之前,一个奇怪的错误会将程序计数器吹走,并将错误清除 在发出指令之前,应观察寄存器: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
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