如何直接读写x86标志寄存器?

从我读过的内容来看,似乎有9种不同的标志。 是否可以直接读取/更改它们? 我知道我可以知道例如在执行cmp / jmp指令后是否设置了零标志,但是我问是否有可能做类似

mov eax, flags

或者其他的东西。

另外,为了写作,是否可以手动设置它们?


有些标志可以通过特定的指令直接设置或清除:

  • CLC,STC和CMC:清除,设置和补充进位标志
  • CLI和STI:清除并设置中断标志(应该以原子方式完成)
  • CLD和STD:清除并设置方向标志
  • 为了读写符号,零,辅助进位,奇偶校验和进位标志,可以使用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来清除,置位和补充进位标志。

    链接地址: http://www.djcxy.com/p/28775.html

    上一篇: How to read and write x86 flags registers directly?

    下一篇: Loop with function call faster than an empty loop