【问题标题】:LDMFD affects R13 oddlyLDMFD 奇怪地影响 R13
【发布时间】:2016-07-07 11:24:26
【问题描述】:

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

【问题讨论】:

  • SPR13R14LR
  • 非常感谢。这是一个拼写错误,受到影响的是R13。我有更改问题到 R13。

标签: arm ucos


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。该问题有一个拼写错误,已修复。 R13(SP) 是具有奇怪行为的寄存器。
  • @shino,上述答案仍然适用。堆栈指针已存储,因此您需要了解您看到的是R13_irq 还是R13_usr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多