【问题标题】:One instruction to clear PF (Parity Flag) -- get odd number of bits in result register清除 PF(奇偶校验标志)的一条指令——在结果寄存器中获取奇数位
【发布时间】:2010-07-15 20:28:41
【问题描述】:

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

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

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

cmp bl, bl

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

and bl, 0 
or  bl, 1

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

【问题讨论】:

  • 我的猜测是否定的,因为 x86 寻址模式。
  • 出于所有实际目的,mov 和其他任何东西一样好。
  • "mov" 不会在 x86 架构上设置标志 - 只有 ALU 操作可以。

标签: assembly x86 micro-optimization parity


【解决方案1】:

试试这个:

foo:  cmp byte [foo],0x7F

注意:这条cmp指令的第一个字节是0x80,0x80-0x7F = 0x01。

【讨论】:

    【解决方案2】:

    不可能。

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

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

    【讨论】:

      【解决方案3】:

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

      目前,没有想到可以满足该条件的 x86 寄存器/寄存器对。

      【讨论】:

      • 或者一个内存位置有一个众所周知的值。这在 DOS 时代是很有可能的,那时人们有机会在面试中遇到和组装问题。
      猜你喜欢
      • 2020-08-20
      • 2017-08-16
      • 2015-04-04
      • 2015-06-29
      • 2015-10-30
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多