英特尔汇编测试标志操作
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 结果。
我正在用 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 位的整数的奇偶校验。 (或者使用 BMIandn eax, eax, ecx
并在循环外设置ecx=1
以在一条指令中执行非与部分。)或者只使用反转的奇偶校验值,其中 1 = 奇校验。
This answer 有几个示例说明如何根据结果中位的水平异或设置 PF。在您的情况下,8 位是 test
内部生成的 AND 结果。