Флаг четности для значения 0 в x86

Я вижу, что в процессорах x86 флаг четности (PF) устанавливается, когда количество битов, установленных равным 1, четно, и что когда-либо проверяются только первые байты (младшие 8 бит) значения.

Единственный случай, в котором я не уверен, это когда мы имеем дело со значением 0.

Я видел по крайней мере другой вопрос, где флаг четности, кажется, установлен на 1 для значения 0.

Например, для значения 8000h все младшие 8 бит равны 0, а флаг четности считается установленным в 1.

Должен ли я согласиться с тем, что для 0 битов, установленных в 1, включается флаг четности, как и для четного числа битов, установленных в 1?


person alt.126    schedule 11.04.2013    source источник


Ответы (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
person Alexey Frunze    schedule 11.04.2013
comment
Возможно, вы захотите изменить первую строку своего ответа, 2 также является четным числом. Важно количество битов, установленных в 1. - person Hans Passant; 12.04.2013
comment
@HansPassant Я думаю, мы трое это понимаем. - person Alexey Frunze; 12.04.2013
comment
Это едва ли не наименее эффективный способ кодирования ассемблера для parity(). cmp [v], 0 / setp byte ptr [p] должно помочь. Или загрузите его с mov и test eax,eax. Но помните, что PF устанавливается только из младшего байта значения, даже с 32-битными test или cmp.) - person Peter Cordes; 21.11.2017
comment
Даже без использования setp вы можете использовать lahf, и это все равно будет более эффективно, чем pushf/pop eax. (Например, pushf составляет 3 моп в Haswell. Но это не так плохо, как popf, потому что чтение IF, DF и других битов EFLAGS, помимо кодов условий, намного дешевле, чем их запись). - person Peter Cordes; 21.11.2017