在x86汇编中,是否可以在一个且只有一条指令中清除奇偶校验标志,在任何初始寄存器配置下工作?
这相当于使用奇数位数创建结果寄存器,任何设置标志的操作(明确排除mov
)。
相反,设置奇偶校验标志可以在一条指令中完成:
cmp bl, bl
有很多方法可以用两条指令清除奇偶校验标志:
and bl, 0
or bl, 1
然而,单指令方法仍然难以捉摸。
答案 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寄存器/寄存器对能够满足这种条件。