题
从我读,似乎像有9个不同的标志。是否有可能读/改变他们直接?我知道我可以知道,例如零的标志设定之后的做cmp/jmp指令,但我要问,如果这是可能做喜欢的东西
mov eax, flags
或者什么的。
此外,对于编写,是否有可能设置他们的手?
解决方案
一些标志可以设定或清除直接与具体说明:
对于阅读和写作的标志,零,辅助进行,奇偶校验和携带标志,可以用 LAHF 到负荷较低的8位(5这些标志,加上不确定的3位)进入的阿登记册,并且可以使用 SAHF 储存这些价值观从啊回到标志的登记册。
你也可以使用 PUSHF 指令,以推动标志栈、阅读和修改它们关于堆叠,然后使用 POPF1 指令来储存他们回到标志的登记册。
注意,你不能设置虚拟机和RF标志与POPF--他们保留他们的先前的数值。同样,你只能改变I/O权限级别在执行时的权限级别0和中断标志只能改变当执行在一个权限级别至少为特权作为I/O权限级别。
注1
注意, popf
是相当缓慢,在现代的Cpu;看看 昂纳雾 优化指导和指示表。这是微编码的,因为在核心模式,它能够改变,如果和交流,以及IO特权的水平。我们受到惩罚,无论模式在目前的Cpu,因为这不是解码器模式敏感。
如果可能的话,使用lahf/sahf而不是pushf/popf绩效,或者保存一个单一的标志你关心似的 setc al
然后稍后 add al, 255
设置 CF = (AL!=0)
.或 setnc al
/ sub al, 1
或什么的。序列设置或清除SF或基于0或1注册也是简单的,具有/不相的标志。
其他提示
你可以使用pushf和popf指令将标志推入堆栈,你可以修改它们,然后将它们弹回。
如果你只需要标志寄存器的低字节(包含SF,ZF,AF,PF,CF),那么有一个奇怪但方便的指令LAHF(哈哈),它加载了底部的8位flags注册到AH,以及其对应的SAHF将AH存储到标志中。
对于进位标志,x86提供CLC,STC和CMC,分别清除,设置和补充进位标志。
最简单的方法是使用 pushf / popf 。
如果您想将 eflags
移动到 eax
,请使用以下代码。
pushf # push eflags into stack
pop %eax # pop it into %eax
<强> SETcc 强>
此指令族是观察某些标志/标志组合的另一种方法。
它根据单个FLAGS设置一个字节的值。
,例如 CF
:
stc
setc al
; al == 1
clc
setc al
; al == 0
<强> JCC 强>
该指令系列当然是某些标志的另一种可能性,可用于实现 SETcc
:
jc set
mov al, 0
jmp end
set:
mov al, 1
end:
- LAHF:负荷状态标志入啊
- 副本低字节的EFLAGS登记册包括的迹象,为零,而进行的标志。
保存一份标志中的一个变量,对于妥善保管
.data saveflags BYTE ? .code lahf ; load flags into AH mov saveflags,ah ; save them into a variable
SAHF:商店啊为标志的状态
- 副本AH入低字节的EFLAGS登记册
检索的价值,标志存储前
.code mov ah, saveflags ; load save flags into AH sahf ; copy into flags register