我无法找到关于如何将ARM上的Carry标志设置为1或0的任何教程。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
与put ARM CPU in different modes和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
这是三个步骤,
一些额外的细节是'原子'行为。即,您可能需要禁用中断和内存故障等。对于某些用户代码或简单的“轮询模式”裸机,上述情况很好。
如果你真的想要'有效';查看周围环境和已知寄存器,您可以执行一些知道将设置/清除进位标志的指令。例如,如果R0为'0',则adds r0,r0,r0
将清除进位标志。像eors R0,R0,R0
这样的指令不会触及进位。这可能取决于您是否还需要了解其他NZV位。符号'cpsr_f'只会改变NZCV位。如果要设置/清除所有这些,可以使用msr cpsr_f, #NZCV_bits
。即,你不关心所有这些 arch restrictions 的旧价值。其他标志,如模式,IRQ等将保持不变。
另见: