Какова цель флага четности на процессоре?
Некоторые процессоры (особенно процессоры x86) имеют флаг четности в своем регистре состояния. Этот флаг указывает, является ли число битов результата операции нечетным или четным.
Какой фактической практической цели служит флаг четности в контексте программирования?
Примечание: я предполагаю, что оно предназначено для использования в сочетании с битом четности, чтобы выполнить базовую проверку ошибок, но такая задача кажется необычной, чтобы гарантировать весь флаг ЦП.
6 ответов
В прежние времена, когда производительность всегда была проблемой, это имело больше смысла. Он использовался в коммуникации для проверки целостности (проверка ошибок), и значительная часть коммуникации была последовательной, что в большей степени использует четность, чем параллельные коммуникации. В любом случае, процессору было тривиально вычислить его, используя всего 8 вентилей XOR, но в остальном было довольно сложно вычислить без поддержки процессора. Без аппаратной поддержки потребовался фактический цикл (возможно, развернутый) или таблица поиска, обе из которых занимали очень много времени, поэтому выгоды перевешивали затраты. Хотя сейчас это больше похоже на пережиток.
Флаг четности - это пережиток давних времен для проверки четности в программном обеспечении.
TL; DR
Что такое паритет
Как сказал Рэндалл Хайд в "Языке искусства ассемблера", 2-е издание:
Четность - это очень простая схема обнаружения ошибок, изначально используемая телеграфами и другими последовательными протоколами связи. Идея состояла в том, чтобы посчитать количество установленных битов в символе и включить дополнительный бит в передачу, чтобы указать, содержит ли этот символ четное или нечетное количество установленных битов. Принимающая сторона передачи также подсчитывает биты и проверяет, что дополнительный бит "четности" указывает на успешную передачу.
Почему Parity Flag был добавлен в архитектуру процессора
В старые времена существовало оборудование последовательной связи (UART), в котором не было возможности проверять четность передаваемых данных, поэтому программистам приходилось делать это программно. Также некоторые действительно старые устройства, такие как перфораторы и считыватели бумажной ленты, использовали 7 бит данных и бит четности, и программисты должны были выполнять проверку четности в программном обеспечении для проверки целостности данных. Чтобы иметь возможность использовать бит четности для обнаружения ошибок, сообщающие стороны должны заранее договориться о том, должен ли каждый передаваемый байт иметь четность или четность (часть протокола связи).
Основными методами проверки четности в программном обеспечении без поддержки ЦП являются подсчет битов или использование таблицы поиска. И то, и другое очень дорого по сравнению с наличием флага четности в ЦП, вычисляемого одной инструкцией. По этой причине в апреле 1972 года Intel ввела Parity Flag в свой 8008 8-битный процессор. Вот пример того, как каждый байт мог быть проверен на целостность на принимающей стороне с тех пор.
mov al,<byte to be tested>
test al,al
jp <somewhere> ; byte has even parity
; byte has odd parity
Затем программа может выполнять все виды условной логики на основе значения флага четности.
Эволюция инструкций условной четности в процессорах Intel
- 1972 - Флаг четности впервые представлен в Intel 8008. Существуют условные инструкции для переходов (
JPO
,JPE
), звонки (CPO
,CPE
) и возвращает (RPO
,RPE
). - 1978 - Intel 8086 отбрасывает все, кроме условных переходов (
JNP/JPO
,JP/JPE
). - 1985 - Условные инструкции
SETPE/SETP
а такжеSETPO/SETNP
добавляются с Intel 80386. - 1995 - Условные инструкции по переезду
CMOVP/CMOVPE
,CMOVNP/CMOVPO
добавляются с помощью Pentium Pro.
Этот набор инструкций, использующих флаг четности, оставался неизменным с тех пор.
В настоящее время основная цель этого флага перешла на аппаратное обеспечение. Цитировать Рэндалла Хайда в "Языке искусства ассемблера", 2-е издание:
Чипы последовательной связи и другое коммуникационное оборудование, которое использует четность для проверки ошибок, обычно вычисляют четность в аппаратных средствах; Вам не нужно использовать программное обеспечение для этой цели.
Древность флага четности подтверждается тем фактом, что он работает только на младших 8 битах, поэтому он имеет ограниченное использование. В соответствии с руководствами для разработчиков программного обеспечения Intel® 64 и IA-32, флаг четности:
Установите, если младший байт результата содержит четное число 1 бит; очищено иначе.
Интересный факт: по его собственным словам инженер сети Вольфганг Керн просканировал весь код, который он написал в какой-то момент (~14 ГБ) для JPE
а также JPO
инструкции и нашел его только в модуле драйвера RS232 и в очень старом 8-битном вычислении.
источники
- Страница поддержки Intel 8008
- Руководство по программированию Intel 8080 Assembly
- Полный набор инструкций 8086
- Википедия x86 инструкции списки
- Руководства разработчика программного обеспечения для архитектур Intel® 64 и IA-32
- Язык искусства ассемблера, 2-е издание Рэндалла Хайда
Есть одна практическая микрооптимизация, достижимая с четностью - это битовая замена, как используется, например, при генерации адреса преобразования Фурье с использованием ядра бабочки.
Чтобы поменять местами биты 7 и 0, можно использовать четность (a&0x81), а затем условную (a^=0x81). Повторите эти действия для битов 6/1, 5/2 и 4/3.
Я был одним из первых авторов журнала Computer World New Zealand в 1980-х годах, а ранее был менеджером MIS в крупной коммунальной компании, которая использовала компьютеры Datapoint. В 1967 году в Datapoint (ранее Computer Terminal Corporation), техасской компании, базирующейся в Сан-Антонио, разработали три человека: Виктор Пур, Гарри Пайл и Джонатан Шмидт. Они попросили компанию Texas Instruments сделать это, и она это сделала, а затем решили не продолжать создание микропроцессоров (не самое лучшее решение!). Затем они поручили эту задачу Intel. В 1971 году компания Datapoint представила настольный компьютер с разрешением 8K, оснащенный этим чипом, который к тому времени стал 8080 iirc, а в 1977 году они изобрели локальную сеть, которую назвали ARC (Attached Resource Computer), и подарили миру два очень важных достижения. . В 1967 году Виктору Пур пришла в голову идея использовать бездисковые машины по высокоскоростным междугородным каналам связи с центральными хранилищами данных (эта идея так и не была реализована!). Следовательно, «Datapoint» аналогичен Power-Point. Написать код пришлось Джонатану Шмидту, тогда еще подростку, и он сказал мне, что не может написать код, который работал бы достаточно быстро, чтобы проверять четность, поэтому он поместил в чип флаг четности. Когда я брал у него интервью, уровень 80286 был достигнут, и он сказал мне: «Забавно, этот флаг все еще находится в чипе». Datapoint продолжала разработку чипа до 286, а затем передала разработку Intel. Вот почему существует флаг четности: подросток Джонатан Шмидт не смог написать код, который работал бы достаточно быстро, чтобы проверить четность при первом разрезе этого чипа, когда он проектировался в доме Виктора Пура в 1967 году.
Лично я считаю, что слухи о смерти паритетного флага сильно преувеличены. Это может быть чрезвычайно полезно в определенных обстоятельствах. Рассмотрим следующую процедуру языка ассемблера:
push rbp
mov rbp, rsp
xor eax, eax
ucomisd xmm0, xmm1
setnp al
pop rbp
ret
Это принимает два аргумента двойной точности в xmm0, xmm1 и возвращает логический результат. Посмотрим, сможешь ли ты понять, что он делает.
Иногда нужно просто подождать, пока кто-нибудь не придумает умный вариант использования заброшенных функций: эффективные n-состояния в системах x86.
С помощью всего одного теста можно проверить переменную на 4 состояния, например:
; flag = {-1, 0, 1, 3}
testl $-1,flag ; and flag with -1 and set condition codes
jz case_1 ; jump if flag == 0
js case_2 ; jump if flag < 0
jp case_3 ; jump if flag > 0 and flag has even parity
; flag > 0 and has odd parity
Кроме того, можно создавать ответвления в виде JNNJNJJNNJN… или NJJNJNNJJNJ… (J=прыжок; N=без прыжка).
Вещи, о которых я могу думать, это:
- JNNJ является инверсией NJJN.
- JNJ, NJN, JNNJ и NJJN также являются палиндромами.
- Вы можете зациклить только один раз в наборе из 3 или дважды в наборе из 3, а затем повторить. На самом деле это где-то используется в демонстрации сборки. Просто найдите правильную отправную точку для точного шаблона, который вам нужен.