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也只能从该值的低位字节中设置。) –