一部のCPU(特にx86 CPU)は、ステータスレジスタにパリティフラグを備えています。このフラグは、演算結果のビット数が奇数か偶数かを示します。
パリティフラグはプログラミングコンテキストでどのような実際の実用的な目的を果たしますか?
サイドノート:基本的なエラーチェックを実行するためにパリティビットと組み合わせて使用することを意図していると思いますが、そのようなタスクはCPUフラグ全体を保証することはまれです。
パフォーマンスが常に懸念されていた「昔」に戻ると、それはより理にかなっています。これは、整合性を検証する(エラーチェックを行う)ために通信で使用され、通信の大部分はシリアルであり、パラレル通信よりもパリティを多く使用します。いずれにせよ、CPUが8つのXORゲートを使用して計算するのは簡単でしたが、それ以外の場合はCPUサポートなしで計算するのはかなり困難でした。ハードウェアサポートなしでは実際のループが発生しました(おそらく展開されます)またはルックアップテーブルはどちらも非常に時間がかかるため、メリットがコストを上回りましたが、今では痕跡のようになっています。
パリティフラグは、ソフトウェアでパリティチェックを行うための昔からの遺物です。
TL; DR
Randall HydeがThe Art of Assembly Language、2nd Editionに書いたように:
パリティは、もともと電信やその他のシリアル通信プロトコルで採用されていた非常に単純なエラー検出方式です。アイデアは、文字のセットビット数をカウントし、その文字に偶数または奇数のセットビットが含まれているかどうかを示すために送信に追加のビットを含めることでした。送信の受信側もビットをカウントし、余分な「パリティ」ビットが送信の成功を示していることを確認します。
昔は シリアル通信ハードウェア(UART) 送信されたデータのパリティチェックを行う機能がなかったため、プログラマーはソフトウェアでそれを行う必要がありました。また、紙テープのパンチやリーダーなどの非常に古いデバイスでは、7データビットとパリティビットが使用され、プログラマーはデータの整合性を検証するためにソフトウェアでパリティチェックを行う必要がありました。エラー検出にパリティビットを使用できるようにするには、通信する当事者は、送信されるすべてのバイトが奇数または偶数のパリティ(通信プロトコルの一部)を持つべきかどうかについて事前に合意する必要があります。
CPUをサポートせずにソフトウェアでパリティチェックを行う主な方法は、ビットカウントまたはルックアップテーブルを使用することです。どちらも、CPUにパリティフラグを1つの命令で計算する場合に比べて非常にコストがかかります。そのため、1972年4月、Intelはパリティフラグを 8008 8ビットCP に導入しました。それ以降、受信側で各バイトの整合性をテストする方法の例を次に示します。
mov al,<byte to be tested>
test al,al
jp <somewhere> ; byte has even parity
; byte has odd parity
次に、プログラムは、パリティフラグの値に基づいて、あらゆる種類の条件付きロジックを実行できます。
JPO
、JPE
)、(CPO
、CPE
)を呼び出し、(RPO
、RPE
)を返します。JNP/JPO
、JP/JPE
)。SETPE/SETP
およびSETPO/SETNP
はIntel80386で追加されました。CMOVP/CMOVPE
、CMOVNP/CMOVPO
はPentiumProで追加されます。パリティフラグを使用するこの一連の命令は、それ以降修正されたままです。
現在、このフラグの主な目的はハードウェアに引き継がれています。 The Art of Assembly Language、2nd EditionでRandall Hydeを引用するには:
エラーチェックにパリティを使用するシリアル通信チップやその他の通信ハードウェアは、通常、ハードウェアのパリティを計算します。この目的のためにソフトウェアを使用する必要はありません。
パリティフラグの古さは、下位8ビットでのみ機能するという事実によって証明されているため、使用が制限されています。インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルによると、パリティフラグは次のとおりです。
結果の最下位バイトに偶数の1ビットが含まれる場合に設定します。それ以外の場合はクリア。
興味深い事実:ネットワークエンジニアのWolfgang Kernは、ある時点(〜14 GB)で書いたすべてのコードをスキャンしてJPE
およびJPO
命令を探し、RS232ドライバーモジュールでのみ見つけました。そして非常に古い8ビット計算で。
パリティで実現可能な実用的なマイクロ最適化が1つあります。これは、バタフライカーネルを使用したフーリエ変換アドレス生成などで使用されるビットスワッピングです。
ビット7と0を交換するには、(a&0x81)のパリティとそれに続く条件付き(a ^ = 0x81)を利用できます。ビット6/1、5/2、および4/3について繰り返します。