如何将ARM上的进位标志设置为0或1?

How to set carry flag on ARM to 0 or 1?

我找不到任何关于如何将 ARM 上的进位标志设置为 1 或 0 的教程。有人可以帮我解决这个问题吗?

put ARM CPU in different modes and linux's irqflags.h一样,设置模式、IRQ和进位标志都可以用相同的方式完成。

一般宏是这样的,

.macro  set_cflag, temp_reg
mrs \temp_reg, cpsr
bic \temp_reg, \temp_reg, #(1<<29)
msr cpsr_f, \temp_reg 
.endm

.macro  clear_cflag, temp_reg
mrs \temp_reg, cpsr
orr \temp_reg, \temp_reg, #(1<<29)
msr cpsr_f, \temp_reg 
.endm

就是三步,

  1. 读取旧值。
  2. 更新工作寄存器中的标志。
  3. 写回值。

一些额外的细节是 'atomic' 行为。即,您可能需要禁用中断和内存故障等。对于某些用户代码或简单的 'polling mode' 裸机,以上内容很好。

如果你真的想成为'efficient';查看您周围的环境和已知的寄存器,您可以执行一些您 知道 将 set/clear 进位标志的指令。例如,如果 R0 为“0”,则 adds r0,r0,r0 将清除进位标志。像 eors R0,R0,R0 这样的指令不会触及进位位。这可能取决于您是否还需要了解其他 NZV 位。符号 'cpsr_f' 只会改变 NZCV 位。如果你想 set/clear 所有这些,你可以使用 msr cpsr_f, #NZCV_bits。即,您不关心所有这些的旧值 arch restrictions 。其他标志,如模式、IRQ 等将保持不变。

另请参阅: