如何在 x86 程序集中设置或清除溢出标志?

use*_*001 5 x86 assembly eflags

我想编写一个简单的代码(或算法)来设置/清除溢出标志。对于设置 OF,我知道我可以使用有符号值。但我怎么能清除呢?

use*_*557 3

有很多可能的解决方案。

例如,test al, al将清除OF标志而不影响寄存器内容。


或者,如果你不想影响其他标志,你可以直接修改寄存器*FLAGS。例如,在 32 位中,这看起来像:

pushfd                   ; Push EFLAGS onto the stack
and dword [esp], ~0x800  ; Clear bit 11 (OF)
popfd                    ; Pop the modified result back into EFLAGS
Run Code Online (Sandbox Code Playgroud)

编辑:更改or al, altest al, al根据Peter Cordes的建议。(效果相同但出于性能原因后者更好)

  • `test al,al` 是根据寄存器的内容设置标志的更好的习惯用法。它只写入标志,因此不会增加涉及“al”的依赖链的长度。不过,“pushf”/“popf”方法+1。(因为`sahf`/`lahf`不包括`OF`)。 (5认同)