清除PF(奇偶校验标志)的一条指令 - 在结果寄存器中获得奇数位

时间:2010-07-15 20:28:41

标签: assembly x86 micro-optimization parity

在x86汇编中,是否可以在一个且只有一条指令中清除奇偶校验标志,在任何初始寄存器配置下工作?

这相当于使用奇数位数创建结果寄存器,任何设置标志的操作(明确排除mov)。

相反,设置奇偶校验标志可以在一条指令中完成:

cmp bl, bl

有很多方法可以用两条指令清除奇偶校验标志:

and bl, 0 
or  bl, 1

然而,单指令方法仍然难以捉摸。

3 个答案:

答案 0 :(得分:3)

试试这个:

foo:  cmp byte [foo],0x7F

注意:此cmp指令的第一个字节为0x80,而0x80-0x7F = 0x01。

答案 1 :(得分:2)

不可能。

当应用于两个副本或寄存器(如或al,al )时,PF更改命令都不能无条件地产生奇数奇偶校验结果。同样,当应用于寄存器时,没有算术命令产生奇数奇偶校验结果,而完全定义结果的常量(如和al,0 或al,ffh )。至于第二个操作数是任何其他常量的命令,结果将取决于寄存器的初始值,我们无法控制它。

如果我们知道执行环境的一些细节,就可以在一个众所周知的地址使用内存的内容。在实模式下的PC兼容模式中,您可以依赖BIOS数据结构。在MS-DOS中,同上可执行文件头。

答案 2 :(得分:0)

我认为除了mov(我闻到面试问题)之外,唯一的方法是找到(奇迹般地,无可否认)一个满足TEST src, dst的寄存器或寄存器对。请参阅here,操作。

此时,没有这样的x86寄存器/寄存器对能够满足这种条件。