从我读,似乎像有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

Runnable GitHub上游断言

<强> JCC

该指令系列当然是某些标志的另一种可能性,可用于实现 SETcc

jc set
mov al, 0
jmp end
set:
mov al, 1
end:

Runnable GitHub上游断言

  • 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 
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top