1
我看到,在x86 CPU中,當設置爲1的位數爲偶數時,奇偶標誌(PF)置位,並且只有第一個字節(低8位)價值都經過測試。x86中值爲0的奇偶校驗標誌
我不知道的唯一情況是,當我們正在處理的0
值我至少等問題都在哪裏見過奇偶標誌似乎被設置爲1的值0。
例如,對於8000H低8位的值都爲0,並且奇偶標誌被說成是設置爲1。
所以,我必須接受對於0位設置爲1,則奇偶校驗標誌被啓用,就像偶數位設置爲1一樣?
我看到,在x86 CPU中,當設置爲1的位數爲偶數時,奇偶標誌(PF)置位,並且只有第一個字節(低8位)價值都經過測試。x86中值爲0的奇偶校驗標誌
我不知道的唯一情況是,當我們正在處理的0
值我至少等問題都在哪裏見過奇偶標誌似乎被設置爲1的值0。
例如,對於8000H低8位的值都爲0,並且奇偶標誌被說成是設置爲1。
所以,我必須接受對於0位設置爲1,則奇偶校驗標誌被啓用,就像偶數位設置爲1一樣?
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
你可能需要調整你的答案的第一線,2爲偶數爲好。重要的是設置爲1的位數。 –
@HansPassant我認爲我們三個都明白這一點。 –
這就是您爲'parity()'編寫asm代碼的最低效方式。 'cmp [v],0' /'setp byte ptr [p]'應該可以做到。或者用'mov'和'test eax,eax'加載它。但請記住,即使使用32位'test'或'cmp',PF也只能從該值的低位字節中設置。) –