在ARM中,SPSR是一个分组寄存器,即在每次模式更改后,CPSR被复制到SPSR中,并且在模式返回后,SPSR被复制回CPSR。为什么CPSR没有直接存入?似乎每个模式更改都有两个附加指令(复制到spsr,复制到cpsr)
答案 0 :(得分:1)
手动模式更改不是 ARM 的效率目标。通常,手动模式更改仅在启动或初始化时设置堆栈等。
cpsr
是活动副本。为什么我们有一个库存lr
注册,但不是当前pc
?对于其他模式,spsr
是已存储 cpsr
;就像不同模式的库存lr
是pc
一样。 银行是为了使异常状态可以透明。 spsr
存储为中断或数据中止可能在任何模式下发生;我们需要保存它,以便我们堆栈正确执行。普通的 unbanked 用户模式永远不会与其他模式堆叠。 模式更改在异常条件中自动完成。
模式寄存器设置为使异常处理非常高效和灵活。 手动模式更改不是很方便,因为它们通常不常用。您可以在切换模式之前将任何存储寄存器复制到未存储的寄存器,以便可以在两者之间传输状态;当 system 模式用于所有异常处理时,这种情况很常见。在这种情况下,寄存器通常由内核存储到任务上下文块,这不是效率问题,因为存在内存存储将进行管道化。