英特尔汇编测试标志操作

intel assembly TEST PF flag operation

我正在用 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?

我遵循了英特尔参考资料,根据这个:

问题是我做错了什么?

BitwiseXNOR 是位的 水平 XNOR,产生一个位。请记住,PF 只有 1 位宽(EFLAGS 中的一个标志),因此写 PF=1111 1111.

没有任何意义

对于 "set flags according to the result" 的指令,它的奇偶校验计算与往常相同,只是它是在 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 指出奇偶校验也是所有位的反转(和 mod 2)。 (因为 XOR 是无进位加法)。可以使用 popcnt eax, eax / not eax / and eax, 1 计算大于 8 位的整数的奇偶校验。 (或者使用 BMI andn eax, eax, ecx 并在循环外设置 ecx=1 以在一条指令中执行非与部分。)或者只使用反转的奇偶校验值,其中 1 = 奇校验。

This answer 有几个示例说明如何根据结果中位的水平异或设置 PF。在您的情况下,8 位是 test 内部生成的 AND 结果。