为什么奇偶校验标志为 1 而个数为奇数

Why parity flag is 1 while number of ones is odd

执行以下两条指令后:

MOV BX, 0FD51H                                        
DEC BX

我得到奇偶校验标志 = 1(表示偶数个)

但是,递减后的值的二进制表示为:

1111 1101 0101 0000

它有9个(即奇数个)。

此外,执行 NEG BX 之后会导致 PF = 0。但是,2 的补码是:

0000 0010 1011 0000有偶数个。所以我希望 PF = 1.

来自英特尔手册(第 3.4.3.1 节 状态标志):

Parity flag — Set if the least-significant byte of the result contains an even number of 1 bits; cleared otherwise.

DEC BX之后的最低有效字节为50h(即1010000b),其中1的个数为偶数。所以你会得到 PF=1.

同理,在NEG之后,最低有效字节为B0h(10110000b),其个数为奇数。所以你得到 PF=0.