如何直接读写x86标志寄存器?
从我读过的内容来看,似乎有9种不同的标志。 是否可以直接读取/更改它们? 我知道我可以知道例如在执行cmp / jmp指令后是否设置了零标志,但是我问是否有可能做类似
mov eax, flags
或者其他的东西。
另外,为了写作,是否可以手动设置它们?
有些标志可以通过特定的指令直接设置或清除:
为了读写符号,零,辅助进位,奇偶校验和进位标志,可以使用LAHF将低8位(5个标志加3个不确定位)加载到AH寄存器中,并且可以使用SAHF来存储这些来自AH的值返回到标志寄存器。
您还可以使用PUSHF指令将标志推入堆栈,在堆栈中读取和修改它们,然后使用POPF指令将它们存储回标志寄存器。
请注意,您不能使用POPF设置VM和RF标志 - 它们保留以前的值。 同样,只能在特权级别0执行时更改I / O特权级别,并且只能在至少与特权级别相同的特权级别执行时更改中断标志。
您可以使用pushf和popf指令将标志推入堆栈,您可以修改它们,然后将它们弹出。
如果你只需要标志寄存器的低字节(包含SF,ZF,AF,PF,CF),那么存在奇怪但方便的指令LAHF(ha ha),它将标志寄存器的低8位加载到AH和其对应的SAHF将AH存入标志。
具体来说,对于进位标志,x86分别提供CLC,STC和CMC来清除,置位和补充进位标志。