LDMFD奇怪地影响R13



我们将 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 会这样改变?

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

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

相关内容

  • 没有找到相关文章

最新更新