在 x86 汇编中,是否可以在一条且仅一条指令中清除奇偶校验标志,在任何初始寄存器配置下工作?
这等效于使用任何设置标志的操作(明确排除)创建具有奇数mov
位的结果寄存器。
相比之下,设置奇偶校验标志可以在一条指令中完成:
cmp bl, bl
并且有很多方法可以用两条指令清除奇偶校验标志:
and bl, 0
or bl, 1
然而,单一指令的方法仍然难以捉摸。
在 x86 汇编中,是否可以在一条且仅一条指令中清除奇偶校验标志,在任何初始寄存器配置下工作?
这等效于使用任何设置标志的操作(明确排除)创建具有奇数mov
位的结果寄存器。
相比之下,设置奇偶校验标志可以在一条指令中完成:
cmp bl, bl
并且有很多方法可以用两条指令清除奇偶校验标志:
and bl, 0
or bl, 1
然而,单一指令的方法仍然难以捉摸。
试试这个:
foo: cmp byte [foo],0x7F
注意:该cmp
指令的第一个字节为 0x80,且 0x80-0x7F = 0x01。
不可能。
当应用于两个副本或一个寄存器(如or al, al)时,任何 PF 更改命令都不能无条件地产生奇校验结果。同样,当应用于寄存器和完全定义结果的常数(如and al, 0 or or al, ffh)时,没有任何算术命令产生奇校验结果。至于第二个操作数是任何其他常数的命令,结果将取决于寄存器的初始值,我们无法控制。
如果我们知道执行环境的一些细节,就有可能使用已知地址的内存内容。在实模式下的 PC 兼容机上,您可以依赖 BIOS 数据结构。在 MS-DOS 中,可执行文件头同上。
我认为除了mov
(我闻到面试问题)之外的唯一方法是找到(奇迹般地,诚然)一个满足的寄存器或寄存器对TEST src, dst
。见这里,操作。
目前,没有想到这样的 x86 寄存器/寄存器对可以满足该条件。