intel 汇编 TEST PF 标志操作

nik*_*ter 1 assembly flags operation parity

我正在使用 进行手动操作TEST (Parity flag operation),问题是我无法获得正确的结果,请考虑以下因素:

ax = 256 = 0000 0001 0000 0000

所以如果我这样做:

test ah, 0x44

标志PF操作应该是:

0000 0000 = 0000 0001 & 0100 0100

PF = 0000 0000 XNOR 0000 0000

PF = 1111 1111

我遵循了英特尔参考资料,根据以下内容:

在此输入图像描述

问题是我做错了什么?

Pet*_*des 5

BitwiseXNOR是位的水平XNOR,产生单个位。请记住,PF 只有 1 位宽(EFLAGS 中的标志),因此写入 没有任何意义PF=1111 1111


对于“根据结果设置标志”的指令来说,奇偶校验计算与往常相同,只是它是在test的内部临时结果上完成的。(和往常一样,在它的低 8 位上,无论操作数大小如何)。

如果设置的位数为奇数,则 PF = 0;如果设置的位数为偶数,则 PF = 1。所以是的,您在评论中发布的表达~(0^0^0^0^0^0^0^0)是正确的。

也可以看看:

  • https://en.wikipedia.org/wiki/Parity_flag
  • https://en.wikipedia.org/wiki/Parity_bit指出奇偶校验也是所有位的反转(sum mod 2)。(因为XOR是加法而不进位)。宽于 8 位的整数的奇偶校验可以用popcnt eax, eax//计算。(或者在循环外使用 BMI和set 来执行一条指令中的非与部分。)或者仅使用反转奇偶校验值,其中 1 = 奇奇偶校验。not eaxand eax, 1andn eax, eax, ecxecx=1

该答案有几个示例,说明如何通过结果中位的水平 XOR 设置 PF。在您的情况下,8 位是内部生成的 AND 结果test