LDMFD奇怪地影响R13

时间:2016-07-07 11:24:26

标签: arm ucos

我们正在使用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会这样改变?

1 个答案:

答案 0 :(得分:0)

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

此外,该指令实际上是异常返回(因为^)。因此,根据您要返回的模式,r14可能会被归档。因此,在异常返回之后,您可能会看到与从内存加载的r14不同的SELECT CONCAT ( CAST ( DOCNUM AS INTEGER ), '_', VERSION ) AS DOC_VER, DOCNUM, VERSION, CHECKOUT_DIR FROM MHGROUP.CHECKOUT WHERE CHECKOUT_DIR LIKE '%\0257\%'