如何将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
就是三步,
- 读取旧值。
- 更新工作寄存器中的标志。
- 写回值。
一些额外的细节是 '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 等将保持不变。
另请参阅:
我找不到任何关于如何将 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
就是三步,
- 读取旧值。
- 更新工作寄存器中的标志。
- 写回值。
一些额外的细节是 '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 等将保持不变。
另请参阅: