Assembly 如何读取x86处理器中的标志寄存器

Assembly 如何读取x86处理器中的标志寄存器,assembly,x86,Assembly,X86,是否有任何汇编指令允许我们直接读取或写入Intel的80386 16位标志寄存器中的溢出标志?如果没有,我们应该使用什么伪代码 Pushf // modify or read ax register Popf 要仅读取溢出标志,请执行以下操作: SETO AL ; AL now contains 1 if the overflow flag was set, and 0 if it wasn't PUSHF POP AX XOR AX,800h ; The overflow f

是否有任何汇编指令允许我们直接读取或写入Intel的80386 16位标志寄存器中的溢出标志?如果没有,我们应该使用什么伪代码

Pushf
// modify or read ax register
Popf

要仅读取溢出标志,请执行以下操作:

SETO AL
; AL now contains 1 if the overflow flag was set, and 0 if it wasn't
PUSHF
POP    AX
XOR    AX,800h  ; The overflow flag is in bit 11
PUSH   AX
POPF

要反转溢出标志:

SETO AL
; AL now contains 1 if the overflow flag was set, and 0 if it wasn't
PUSHF
POP    AX
XOR    AX,800h  ; The overflow flag is in bit 11
PUSH   AX
POPF

要将标志读入
AX

pushf
pop ax
写入标志:如果需要设置/清除特定位,有一些命令,如
stc/clc
(用于进位标志)、
std/cld
(用于方向)等;但不是比特以这种方式暴露出来。要写入整个标志寄存器,请使用

push ax
popf

可以使用pushf和popf来使用stack保存/恢复它们。(popfd、popfq分别恢复EFLAGS/RFLAGS的32位和64位扩展)
pushf
将EFLAGS写入堆栈,而不是写入
ax
。OP要求16位标志;您的代码是32位的-这是一个相当小的细节,考虑到如何生成16位的相同代码应该是显而易见的。无论如何,编辑了答案。显然不是这样,因为问题标题只提到阅读旗帜。在写我最初的答案时,我只是忽略了一个细节,老实说,我并不认为这会让这个例子“毫无用处”。