2013-03-13 121 views
4

是否有汇编指令让我们直接读写英特尔80386 16位标志寄存器中的溢出标志?如果不是,我们应该使用哪些伪代码?如何在x86处理器中读取标志寄存器

+4

可以使用pushf和popf使用堆栈保存/恢复它们。 (popfd,popfq分别恢复EFLAGS/RFLAGS的32位和64位扩展) – 2013-03-13 15:19:26

回答

0

使用

Pushf 
// modify or read ax register 
Popf 
+2

'pushf'将eflags写入堆栈,而不是'ax'。 – 2013-03-13 15:21:01

7

为只读溢出标志:

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 
+0

该OP是要求16位FLAGS;你的代码是32位的。 -1不读这个问题。 – 2013-03-13 15:57:43

+2

这是一个相当小的细节,因为考虑到如何使相同的代码为16位应该是显而易见的。无论如何编辑答案。 – Michael 2013-03-13 16:07:49

+2

显然不是这样,因为问题标题只提到阅读标志。当我写下我的初步答案时,我简单地忽略了一个细节,我真的不认为这个例子“没有用处”。 – Michael 2013-03-13 16:23:08

1

要读取标志为AX

pushf 
pop ax 

要写标志:如果你需要设置/清除特定的位,有一些命令如stc/clc(用于进位标志),std/cld(用于方向)等;但没有位暴露在这种方式。要写整个标志寄存器,请使用

push ax 
popf