在 x86 汇编中,是否可以在一条且仅一条指令中清除奇偶校验标志,在任何初始寄存器配置下工作?
这相当于创建一个具有奇数位的结果寄存器,以及任何设置标志的操作(明确排除 mov
)。
相比之下,设置奇偶校验标志可以在一条指令中完成:
cmp bl, bl
并且有很多方法可以通过两条指令清除奇偶校验标志:
and bl, 0
or bl, 1
然而,单一指令的方法仍然难以捉摸。
最佳答案
不可能。
当应用于两个副本或一个寄存器(如或 al,al)时,没有任何 PF 更改命令可以无条件地产生奇校验结果。同样,当应用于寄存器和完全定义结果的常量(如 and al、0 或 or al、ffh)时,没有任何算术命令会产生奇校验结果。至于第二个操作数是任何其他常数的命令,结果将取决于寄存器的初始值,我们无法控制。
如果我们知道执行环境的一些细节,就有可能在一个众所周知的地址使用内存的内容。在实模式下的 PC 兼容机上,您可以依赖 BIOS 数据结构。在 MS-DOS 中,可执行文件头也是如此。
关于assembly - 一条清除PF(奇偶校验标志)的指令——获得结果寄存器中的奇数位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3259759/