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

时间:2017-08-24 07:08:51

标签: arm carryflag

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

1 个答案:

答案 0 :(得分:1)

put ARM CPU in different modeslinux'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. 重新写回来。
  4. 一些额外的细节是'原子'行为。即,您可能需要禁用中断和内存故障等。对于某些用户代码或简单的“轮询模式”裸机,上述情况很好。

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

    另见: