有没有办法手动更改每个标志?或者你必须使用一个你知道会改变它们的结果的命令吗?
基本上我正在使用命令RCL
,我不想在开始时获得1,所以我想将 CF 更改为0,我知道我可以使用如下命令:
mov al, 0
shl al, 1
但我想知道是否有其他方法可以做到这一点,而不使用其他命令结果。
我还想知道您是否可以向我展示,也可以用来更改所有标志,不仅包括CF,还包括OF,ZF等。
答案 0 :(得分:3)
没有任何指令将eflags
视为读写GP寄存器
引用英特尔 1 :
EFLAGS寄存器中的某些标志可以使用专用指令直接修改(如 以下部分)。 没有说明允许直接检查或修改整个注册 以下指令可用于将标志组移入和移出过程堆栈或EAX寄存器:
LAHF,SAHF,PUSHF,PUSHFD,POPF和POPFD。将EFLAGS寄存器的内容转移到之后 在过程堆栈或EAX寄存器中,可以使用处理器的位操作来检查和修改标志 说明(BT,BTS,BTR和BTC)。
eflags
寄存器分为三组:状态标志,控制标志和系统标志。
在状态标志中,只能使用clc
,stc
,cmc
直接操作 CF 。
没有阅读 CF 的说明,但您可以使用cmovcc
,adc
,setcc
等指令间接阅读。
所有其他标志需要使用专门定制的算术指令或将eflags
的状态组内容复制到ah
(带lahf
)或堆栈(使用pushfd
)而不是eflags
(sahf
或popfd
)。
在控制标记组中,只有 DF 可以使用cld
和std
进行操作。
要阅读DF
的当前值,您需要使用pushfd
。
系统标志通常通过执行某些特权操作来间接操作,例如切换任务,进入v86模式等。
可以使用cli
和sti
直接操作 IF
所有其他标志只能使用pushfd
/ popfd
进行操作。
供参考:
rflags
,但到目前为止保留了较高的32位,因此rflags
被处理为eflags
。 pushfd
将eflags
推送到堆栈上。还有一个16位版本pushf
仅推送eflags
的低16位。 popfd
/ popf
也是如此。 lahf
/ sahf
仅复制状态标志。 1 英特尔手册,第1卷,第3.4.3节。