フラグレジスター
読み:フラグレジスター
外語:flag register

 マイクロプロセッサーで演算処理結果等を表わすために特に専用に用意されたレジスターのこと。専用レジスターの一つ。
目次

概要
 実際にはプロセッサーにより様々な呼ばれ方をするが、8080の頃からの慣わしで、総じてフラグレジスターと呼ばれる。
 格納される内容などはプロセッサーの設計を大きく反映しており、プロセッサーごとに様々である。
 特殊な設計のものを除き、一般的にプログラムを組む上で必要となるため、たいていのプロセッサーで専用レジスターとして用意されている。例外としては、MIPSのようにコンセプトとしてフラグレジスターを廃したものや、Intel ItaniumIA-64モードように複数命令を同時実行するためにありふれたフラグレジスターが用意できなかったものなどがある。

特徴

構成
 フラグは、条件分岐などに使うための演算結果を保存するビットと、CPUの動作を決める情報を保存するビットとがある。
 初期のCPUは特権モードを持たないためプログラムから任意に変更できたが、昨今のCPUは特権モードを持ち、オペレーティングシステムからしか制御できないようにしていることが多い。

条件分岐用ビット
 値を比較して、一致・不一致や、大小などに応じて分岐する必要がある。
 CPUに応じて、これは大きく二種類にコンセプトが分かれる。
 8080/Z80などから普及が始まる初期のCPUでは前者、RISCなど構成をシンプルにするものは後者が採用されることがある。

0と1
 フラグは、0か1かの1ビットで表現されるものが多い。
 この時、1にすることを「セット」、0にすることを「クリア」というほか、1にセットされることを「フラグを立てる」ともいう。
 各フラグの状態が0か1かを見るには、専用の命令を用いたり、ビットマスク演算を用いたりする。

実装例
 プロセッサーごとの実装の差は次のとおり(順不同)。

Intel 8080
 8ビットで「Fレジスター」と呼ばれた。アキュームレーターであるAレジスターと共にAFレジスターとして16ビット処理できた。
 この仕様は、上位互換のZ80はもとより、Intel自身もx86でそのまま仕様を温存した。

ZiLOG Z80
 8080の上位互換である。8ビットで「Fレジスター」と呼ばれ、8080にはない裏レジスター「F'レジスター」が存在する。
 アキュームレーターであるAレジスターと共にAFレジスターとして16ビット処理できた。
 8080と比して、ビット2がP/Vとなり、命令によってオーバーフローフラグとしても使われるようになった。
 また8080で未使用だったビット1が拡張され、N=サブトラクトフラグとして使用されている。この謎のNフラグは、Z80で拡張されたDAA命令のためだけに存在する。

Intel x86
 下位8ビットは8080を引き継ぎ、16ビット化した「FLAGS」とした。
 i386以降は32ビットの「EFLAGS」、AMD64以降は64ビットの「RFLAGS」とされている。
 以下は8086の「FLAGS」。32ビット化されたものは「EFLAGS」を参照のこと。
 Z80がオーバーフローフラグをビット2としてパリティフラグと共用にしたのに対して、x86ではビット11に新たに定義した。

MOS 6502
 8ビットで「Pレジスター」と呼ばれた。

Motorola 6800
 8ビットで「CCR」(コンディションコードレジスター)と呼ばれた。

Motorola 6809
 8ビットで「CCレジスター」(コンディションコードレジスター)と呼ばれた。
 6800の拡張であり、未定義だったビット6と7に新たなフラグを割り当てた。

Motorola 68000
 16ビットで「SR」(ステータスレジスター)と呼ばれた。
 このうち、下位8ビットがユーザーバイト、上位8ビットがシステムバイトと呼ばれている。
 下位4ビットの配列は、6800や6809の影響があると思われる。

PowerPC
 PowerPCは「CR」(コンディションレジスター)と呼ばれ、4ビット8組で総計32ビットである。
 8組のCRは、CR0からCR7まであり、演算の際にどのCRに結果を格納するかを選択できる。これは、分岐命令の前に複数の演算をあらかじめ実施しておくことができることを意味する。

Intel Itanium(IA-64)
 Intel ItaniumのIA-64は、複数命令を同時実行するため、一般的なフラグレジスターを用意しない。
 代わりに、64ビット長でフラグ目的に使う汎用レジスターであるプレディケートレジスターを用意した。
 比較命令は、プレディケートレジスターのどのビットに結果を格納するかを選択する。
 条件分岐命令は、プレディケートレジスターの指定されたビットを参照する。

ルネサス H8
 8ビットで「CCR」(コンディションコードレジスター)と呼ばれた。

ルネサス SuperH
 32ビットで「SR」(ステータスレジスター)と呼ばれた。
 条件分岐のフラグは「T」しかなく、演算や比較命令を実行する際に条件をつけ、結果をTに入れる方式だった。

Microchip PIC
 レジスターファイルと呼ばれる領域の中に「STATUSレジスター」がある(ページ0で03h、ページ1で83h、ページ2で103h、ページ4で183h)。

ARMアーキテクチャ
 ARMではCPSR(カレントプログラムステータスレジスタ)と呼ばれている。

MIPSアーキテクチャー
 MIPSアーキテクチャーにはフラグレジスター相当がない。
 演算結果は常に汎用レジスターに格納され、分岐命令は汎用レジスターの値を参照して0か非0かによって動作する。

再検索