2013-04-11 82 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也只能從該值的低位字節中設置。) –