Assembly ARM当前程序状态寄存器(SPSR)读修改写策略实践

Assembly ARM当前程序状态寄存器(SPSR)读修改写策略实践,assembly,coding-style,arm,cpu-registers,Assembly,Coding Style,Arm,Cpu Registers,图2-10标识为不修改(DNM)的位,读作 零(RAZ),不得由软件修改。这些位是: •可读,以使处理器状态得以保留,例如, 进程间上下文切换 •可写,以启用处理器 要恢复的状态。保持与未来ARM的兼容性 处理器,作为良好实践,强烈建议您使用 更改CPSR时读取修改写入策略 但通过按位操作,您已经可以清楚地定义要更改的位,而无需修改任何意外值,并且可以避免浪费额外的周期。这项建议的原因是什么?手册警告您的是,不要向DNM位写入零(或任何内容),假设它们不会被修改-这在当前的处理器实现中可能是这样

图2-10标识为不修改(DNM)的位,读作 零(RAZ),不得由软件修改。这些位是:

•可读,以使处理器状态得以保留,例如, 进程间上下文切换

•可写,以启用处理器 要恢复的状态。保持与未来ARM的兼容性 处理器,作为良好实践,强烈建议您使用 更改CPSR时读取修改写入策略


但通过按位操作,您已经可以清楚地定义要更改的位,而无需修改任何意外值,并且可以避免浪费额外的周期。这项建议的原因是什么?

手册警告您的是,不要向DNM位写入零(或任何内容),假设它们不会被修改-这在当前的处理器实现中可能是这样,但即使今天是这样,在未来的实现中也可能不是这样

类似地,他们似乎保留将来更改RAZ位的权利,以便它们可能不总是零,或者向它们写入一个1可能会导致状态发生一些变化,即使重新读取该位仍然读取为零


此外,请记住,大多数“明确定义要更改的位”的按位操作通常会导致读/写/修改序列。例如,
val |=0x08执行读/修改/写操作

也有避免/减少掩蔽的具体说明。例如,
msr cpsr\u c,r2
。另请参见:在您的标题中,您编写了SPSR(保存的程序状态寄存器),但我认为您的意思是CPSR。@Étienne这是真正的CPSR vs SPSR;他们是不同的。但是基本的概念同样适用于两者,我没有这样想过。谢谢你的解释!