2013-04-11 40 views
1

我看到,在x86 CPU中,当设置为1的位数为偶数时,奇偶标志(PF)置位,并且只有第一个字节(低8位)价值都经过测试。x86中值为0的奇偶校验标志

我不知道的唯一情况是,当我们正在处理的0

值我至少等问题都在哪里见过奇偶标志似乎被设置为1的值0。

例如,对于8000H低8位的值都为0,并且奇偶标志被说成是设置为1。

所以,我必须接受对于0位设置为1,则奇偶校验标志被启用,就像偶数位设置为1一样?

回答

6

0的位数是偶数,所以答案是肯定的。

测试:

// compiled with Open Watcom C/C++ 1.9 
#include <stdio.h> 

unsigned parity(unsigned v) 
{ 
    unsigned p = 0; 
    __asm 
    { 
    mov eax, v 
    or eax, eax 
    pushf 
    pop eax 
    shr eax, 2 
    and eax, 1 
    mov p, eax 
    } 
    return p; 
} 

int main(void) 
{ 
    unsigned i; 
    for (i = 0; i < 8; i++) 
    printf("PF(%u) = %u\n", i, parity(i)); 
    return 0; 
} 

输出:

PF(0) = 1 
PF(1) = 0 
PF(2) = 0 
PF(3) = 1 
PF(4) = 0 
PF(5) = 1 
PF(6) = 1 
PF(7) = 0 
+1

你可能需要调整你的答案的第一线,2为偶数为好。重要的是设置为1的位数。 –

+1

@HansPassant我认为我们三个都明白这一点。 –

+0

这就是您为'parity()'编写asm代码的最低效方式。 'cmp [v],0' /'setp byte ptr [p]'应该可以做到。或者用'mov'和'test eax,eax'加载它。但请记住,即使使用32位'test'或'cmp',PF也只能从该值的低位字节中设置。) –