2016-07-07 104 views
0

我们使用arm9和ucos。通用移植函数的最后一个工具在我们的系统中具有奇怪的行为。LDMFD奇怪地影响R13

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

'SP'是'R13'。 'R14'是'LR'。 – Michael

+0

非常感谢。这是一个拼写错误,它是受到影响的R13。我改变了对R13的问题。 – shino

回答

0

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

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

+0

非常感谢。这个问题有一个已经修复的拼写错误。 R13(SP)是有奇怪行为的寄存器。 – shino

+0

@shino,上述答案仍然适用。堆栈指针是分区的,因此您需要了解是否看到“R13_irq”或“R13_usr”。 –