Assembly 如何读取x86处理器中的标志寄存器
是否有任何汇编指令允许我们直接读取或写入Intel的80386 16位标志寄存器中的溢出标志?如果没有,我们应该使用什么伪代码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
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位的相同代码应该是显而易见的。无论如何,编辑了答案。显然不是这样,因为问题标题只提到阅读旗帜。在写我最初的答案时,我只是忽略了一个细节,老实说,我并不认为这会让这个例子“毫无用处”。