为什么这个PUSH指令会在我的ARM处理器上导致UNDEFINED_INSTRUCTION异常?

时间:2014-01-13 14:45:00

标签: exception assembly arm

我正在使用Cortex-A9,我的程序由于UNDEFINED_INSTRUCTION异常而崩溃。导致此异常的装配线是根据我的调试器的跟踪:

跟踪#9999:S:0x022D9A7C E92D4800 ARM PUSH {r11,lr}

例外:UNDEFINED_INSTRUCTION(9)

我在C编程并且不编写汇编或二进制文件而我正在使用gcc。这真的是导致异常的指令,即这个PUSH指令的编码是错误的,因此编译器/汇编程序错误?或者编码是否正确并且发生了什么奇怪的事情?滚动回跟踪我发现另一个PUSH指令,它不会导致错误,看起来像这样:

跟踪#9966:S:0x022A65FC E52DB004 ARM PUSH {r11}

当然还有很多其他的PUSH指令。但我没有找到任何其他试图推特R11和LR,所以我无法比较。

我不能回答我自己的问题,所以我编辑它:

对不起伙计们,我不知道发生了什么事。我试了好几次,一次又一次地得到同样的错误。然后我关闭了设备,离开后再试一次,知道它工作正常...... 也许是由于过热或某种原因导致内存损坏?我不知道。无论如何,谢谢你的回答。 我用gcc 4.7.2顺便说一句。

1 个答案:

答案 0 :(得分:0)

我怀疑某些东西正在腐蚀SP寄存器。在架构中未定义加载/存储多个(其中PUSH是一个别名)到未对齐的地址,因此如果SP被不是4的倍数覆盖,则后续的push / pop将抛出undef异常。

现在,如果您使用的是ARM Linux,那么(通常)会有一个kernel trap for unaligned accesses从过去的糟糕日子遗留下来,如果启用它将尝试修复大多数未对齐的加载/存储多条指令(尽管它们是在架构上无效)。但是,如果地址无效(在SP被废话覆盖的情况下很可能),它将放弃并离开undef处理程序来执行其操作。

在(非常不可能)的情况下,编译器以某种方式生成了大部分时间都可以修复的错误代码,

cat /proc/cpuinfo/alignment

会显示一些非零修正计数,但正如我所说,它很可能是损坏 - 前一个函数已经破坏了堆栈,使得返回时加载了无效的SP,然后显示在下一个堆栈中操作。最好仔细检查你的指针和数组访问。