0

我们将 arm9 与 ucos 一起使用。通用移植功能的OS_CPU_ARM_ExceptHndlr_BrkTask最后一个工具在我们的系统中有奇怪的行为。

Instrument: LDMFD SP!,{R0-R12,LR,PC}^

假设 SP 为 0x10002000,后面的 15 个 DWORD(将被复制到 R0-R12、LR、PC)的值从 1 到 15。我们发现 PC(R15)发生了变化并跳转到 15,但 SP (R13) 被更改为一个奇怪的值(远离堆栈内存空间的地址)。我预计它会变成 0x1000203C (0x10002000+4*15)。

为什么R13会这样改?

4

1 回答 1

0

r14与其他寄存器一样,该指令从堆栈中加载。写入 PC 会导致跳转。这不是将返回地址设置到链接寄存器的分支和链接。

此外,这条指令实际上是一个异常返回(因为 ^)。因此,根据您返回的模式,r14可能会被存入银行。因此,在异常返回后,您可能会看到与r14从内存中加载的不同。

于 2016-07-07T19:52:43.870 回答