我试图在ARM Cortex-M3裸机上运行已编译的程序。在系统甚至达到应用程序代码之前,奇怪的错误将程序计数器吹走并出错。LDMIA指令导致寄存器数据损坏
指令之前,寄存器被观察到:
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}
而正被读取的寄存器爆炸。它还发送程序计数器的方式,有效地终止程序。
...
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
我读过a similar issue on stack overfflow,但它似乎并没有是我在这里面临的直接问题。 The ATMEL documentation for this board没有指定一个快速浏览一次读取的内部寄存器数量的限制。
对这个问题有任何想法,如果可能的话,在gcc的一个解决方法,以防止它?
'ldmia'从堆栈中加载,并且没有显示堆栈中的内容。如果堆栈中的数据损坏,该指令可能会正常运行。 – Jester
拇指指令不允许除Thumb2(armv7m)扩展名外的许多寄存器。假设您的文本来自反汇编程序,反汇编程序不会显示所有这些寄存器。正如你自己指出的那样,电脑坏了,所以ldmia正在修改电脑,而Jester指出的电脑可能是坏的。在指令前转储堆栈并查看它包含的内容。 –
只有'sp 0x7ffe0'在指令前很重要,不确定为什么你发布了其他寄存器。你不是想要做一个“推入堆栈”'stmia'吗?如果不是,那么在此之前的代码必须已经将足够的值放入堆栈。 – Ped7g