在cortex-m0 +处理器中,有一个名为“程序状态寄存器”(简称psr)的寄存器,它包含3条重要信息:
正如您所期望的那样,只需通过mrs r0, psr
指令读取psr即可访问所有这些位字段。我感到困惑的是page 16-17 of the m0+ User Manual。该手册告诉我,通过读取“ipsr”而不是“psr”,我只能访问异常编号位(所有其他位设置为零)。基本上,
mrs r0, ipsr
和
mrs r0, psr
and r0, r0, #0x3f
是完全相同的。
为什么提供这些替代方法来访问psr中的位域?
我最好的猜测是上下文切换或ISR代码只想读取底部的6位,这样可以节省(不是非常昂贵的)imoking操作。
答案 0 :(得分:3)
我认为你遗失的是,自从ARMv 3 以来,mrs
/ msr
指令已经存在了20多年前(当PC从24岁开始增长时)到32位,所以其他的东西被从r15踢出一个特殊的状态寄存器)。 ARM编码始终必须区分SPSR与CPSR与CPSR的部分。当Thumb-2在ARMv6之后出现时,Thumb编码因此也必须区分SPSR与CPSR与ARM1156 / Cortex-A上CPSR的部分。
关键是,这些编码中已有位用于编码经典/ A级架构中的多个目标状态寄存器 - 实际上,即使在ARMv7-A虚拟化扩展还添加了各种分组寄存器。现在想象一下,您正在设计一种新架构,将您成功的嵌入式ISA /设计专业知识/开发生态系统推向低端微控制器领域,其中8位部件占主导地位,代码大小和效率关键。那么问题就变成了为什么你不将那些未使用的指令编码位按下来使状态寄存器访问尽可能高效?
答案 1 :(得分:0)
如果您只需要IPSR
字段,则可以使用相应的(单个)指令。
我认为第二个例子只是为了澄清行为,因为这是负责屏蔽数据并将所有顶部位设置为0的CPU。