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

CX *_*mer 2 assembly arm coding-style cpu-registers

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

•可读,用于保持处理器状态,例如,在进程上下文切换期间

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

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

Mic*_*urr 5

手册警告你的是不要在DNM位写入零(或其他),假设它们不会被修改 - 在当前的处理器实现中可能是这种情况,但即使今天情况如此,它可能也不是在未来的实施中.

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

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