3

以下代码片段取自 linux v2.6.11。v3.8 中也有类似的东西。

mrs     r13, cpsr
bic     r13, r13, #MODE_MASK
orr     r13, r13, #MODE_SVC
msr     spsr_cxsf, r13                  @ switch to SVC_32 mode

and     lr, lr, #15
ldr     lr, [pc, lr, lsl #2]
movs    pc, lr                          @ Changes mode and branches

查看以下链接以获取实际文件: http: //lxr.linux.no/linux+v2.6.11/arch/arm/kernel/entry-armv.S

我认为写入 CPSR 的模式位可以改变当前的 ARM 模式。但是写入 SPSR(而不是 CPSR)是如何导致切换到 SVC_32 模式的呢?

(或)最后一条指令“movs pc, lr”中是否发生了某些事情。有人可以帮我理解这一点吗?

4

2 回答 2

7

带有“S”后缀和程序计数器作为其目标寄存器的指令mov或指令意味着异常返回。sub

它将 SPSR 的内容复制到 CPSR 并将源寄存器的值移动到程序计数器(在本例中为链接寄存器)。

在您的示例中,这有效地将模式设置为 SVC 模式并一次性从函数返回。

ARM 参考手册中有更多相关信息。

于 2013-03-21T10:03:54.673 回答
0

我在这里回答SPSRVsCPSR问题。

CPSRuser/system模式寄存器,在其他模式下不存在,比如fiqorirq模式。而,SPSR存在于fiqirq模式中。在模式更改CPSR被复制到SPSR并且更改的模式必须用于SPSR对处理器的当前状态进行任何更改。SPSR在用户模式下不可用。并且在非用户模式下所做的任何更改CPSR都不会生效。

CPSR - Current Program Status Register
SPSR - Saved Program Status Register
于 2013-03-24T21:25:07.597 回答