有没有办法手动更改每个标志?或者您是否必须使用一个您知道会改变它们的结果的命令?
基本上我正在使用命令RCL
,而且我不想一开始就得到1,所以我想改变CF到 0,我知道我可以使用如下命令:
mov al, 0
shl al, 1
但我想知道是否有其他方法可以做到这一点,而不使用其他命令结果。
我还想知道你向我展示的方式是否也可以用来改变all标志的数量,不仅是CF,还有OF、ZF等等。
There isn't any instruction that treat eflags
as read-write GP-register.
Quoting Intel1:
EFLAGS 寄存器中的一些标志可以使用专用指令直接修改(参见
以下部分)。没有指令允许直接检查或修改整个寄存器.
以下指令可用于将标志组移入或移出过程堆栈或 EAX 寄存器:
LAHF、SAHF、PUSHF、PUSHFD、POPF 和 POPFD。当 EFLAGS 寄存器的内容被传送到
过程堆栈或 EAX 寄存器,可以使用处理器的位操作检查和修改标志
指令(BT、BTS、BTR 和 BTC)。
The eflags
寄存器分为三组:状态标志, 控制标志 and 系统标志.
Of the 状态标志只有CF可以直接操作clc
, stc
, cmc
.
没有阅读说明CF但你可以通过如下指令间接阅读它cmovcc
, adc
, setcc
。
所有其他标志都需要使用专门定制的算术指令或通过应对状态组内容eflags
into ah
(with lahf
)或堆栈(与pushfd
)然后再回到eflags
(with sahf
or popfd
).
In the 控制标志组里只有DF可以操纵cld
and std
.
读取当前值DF
你需要使用pushfd
.
The 系统标志通常通过执行一些特权操作(例如切换任务、进入 v86 模式等)来间接操纵。
The IF可以直接操作cli
and sti
.
所有其他标志只能用pushfd
/popfd
.
以供参考:
- 在 64 位模式下,标志寄存器是
rflags
但到目前为止,高 32 位被保留,从而rflags
被处理为eflags
.
-
pushfd
pushes eflags
在堆栈上。还有一个 16 位版本pushf
仅推送低 16 位eflags
。同样适用于popfd
/popf
.
-
lahf
/sahf
仅复制状态标志。
1 Intel Manuals, Volume 1, Section 3.4.3.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)