フラグレジスター
読み:フラグレジスター
外語:flag register
マイクロプロセッサー
で演算処理結果等を表わすために特に専用に用意された
レジスター
のこと。
専用レジスター
の一つ。
目次
概要
特徴
構成
条件分岐用ビット
0と1
実装例
Intel 8080
ZiLOG Z80
Intel x86
MOS 6502
Motorola 6800
Motorola 6809
Motorola 68000
PowerPC
Intel Itanium(IA-64)
ルネサス H8
ルネサス SuperH
Microchip PIC
ARMアーキテクチャ
MIPSアーキテクチャー
概要
実際にはプロセッサーにより様々な呼ばれ方をするが、
8080
の頃からの慣わしで、総じてフラグレジスターと呼ばれる。
格納される内容などはプロセッサーの設計を大きく反映しており、プロセッサーごとに様々である。
特殊な設計のものを除き、一般的にプログラムを組む上で必要となるため、たいていのプロセッサーで専用レジスターとして用意されている。例外としては、MIPSのようにコンセプトとしてフラグレジスターを廃したものや、
Intel Itanium
の
IA-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ビット処理できた。
ビット7: S サインフラグ
ビット6: Z
ゼロフラグ
ビット5: ‐ 未使用 (常時0)
ビット4: H ハーフキャリーフラグ (BCD桁上がり計算用)
ビット3: ‐ 未使用 (常時0)
ビット2: P パリティフラグ
ビット1: ‐ 未使用 (常時0)
ビット0: C
キャリーフラグ
この仕様は、上位互換のZ80はもとより、Intel自身もx86でそのまま仕様を温存した。
ZiLOG
Z80
8080の上位互換である。8ビットで「Fレジスター」と呼ばれ、8080にはない裏レジスター「F'レジスター」が存在する。
アキュームレーターであるAレジスターと共にAFレジスターとして16ビット処理できた。
ビット7: S サインフラグ
ビット6: Z
ゼロフラグ
ビット5: ‐ 未使用 (常時0)
ビット4: H ハーフキャリーフラグ (BCD桁上がり計算用)
ビット3: ‐ 未使用 (常時0)
ビット2: P/V パリティー/オーバーフローフラグ (8080ではP=パリティフラグ)
ビット1: N サブトラクトフラグ (直前が加算命令なら0クリア、減算命令なら1セット)
ビット0: C
キャリーフラグ
(桁上がり、桁下がり)
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
」を参照のこと。
ビット15‐12: 未使用 (常時0)
ビット11: OF オーバーフローフラグ
ビット10: DF ディレクションフラグ
ビット9: IF 割り込みフラグ
ビット8: TF トラップフラグ、トレースフラグ
ビット7: SF サインフラグ
ビット6: ZF
ゼロフラグ
ビット5: ‐ 未使用 (常時0)
ビット4: AF 補助キャリーフラグ (BCD桁上がり計算用)
ビット3: ‐ 未使用 (常時0)
ビット2: PF パリティフラグ (演算結果の下位8ビット)
ビット1: ‐ 未使用 (常時1)
ビット0: CF
キャリーフラグ
Z80がオーバーフローフラグをビット2としてパリティフラグと共用にしたのに対して、x86ではビット11に新たに定義した。
MOS
6502
8ビットで「Pレジスター」と呼ばれた。
ビット7: N ネガティブフラグ (演算結果の正負、具体的にはAレジスターのMSB)
ビット6: V オーバーフローフラグ
ビット5: ‐ 未使用 (常時1)
ビット4: B ブレークフラグ
ビット3: D デシマルフラグ (BCDモードへの切り替え用)
ビット2: I インタラプトフラグ (1で割り込み禁止)
ビット1: Z
ゼロフラグ
ビット0: C
キャリーフラグ
Motorola
6800
8ビットで「CCR」(コンディションコードレジスター)と呼ばれた。
ビット7: ‐ 未使用 (常時1)
ビット6: ‐ 未使用 (常時1)
ビット5: H ハーフキャリーフラグ (BCD桁上がり計算用)
ビット4: I IRQマスク・フラグ (IRQ割込禁止をするか(1)、否か(0))
ビット3: N ネガティブフラグ (負か(1)、正か(0))
ビット2: Z
ゼロフラグ
(ゼロか(1)、否か(0))
ビット1: V オーバーフローフラグ (符号付き演算での桁溢れ)
ビット0: C
キャリーフラグ
(桁上がり、桁下がり)
Motorola
6809
8ビットで「CCレジスター」(コンディションコードレジスター)と呼ばれた。
6800の拡張であり、未定義だったビット6と7に新たなフラグを割り当てた。
ビット7: E エンタイアーフラグ (割込で全レジスターを退避した(1)、PC/CCのみ(0))
ビット6: F FIRQマスクフラグ (FIRQ割込禁止をするか(1)、否か(0))
ビット5: H ハーフキャリーフラグ (BCD桁上がり計算用)
ビット4: I IRQマスク・フラグ (IRQ割込禁止をするか(1)、否か(0))
ビット3: N ネガティブフラグ (負か(1)、正か(0))
ビット2: Z
ゼロフラグ
(ゼロか(1)、否か(0))
ビット1: V オーバーフローフラグ (符号付き演算での桁溢れ)
ビット0: C
キャリーフラグ
(桁上がり、桁下がり)
Motorola 68000
16ビットで「SR」(ステータスレジスター)と呼ばれた。
このうち、下位8ビットがユーザーバイト、上位8ビットがシステムバイトと呼ばれている。
下位4ビットの配列は、6800や6809の影響があると思われる。
ビット15: T トレースビット
ビット14: ‐ 未使用
ビット13: S スーパーバイザービット
ビット12: ‐ 未使用
ビット11: ‐ 未使用
ビット10‐8: I2‐I0 インタラプトマスク
ビット7: ‐ 未使用
ビット6: ‐ 未使用
ビット5: ‐ 未使用
ビット4: X 拡張フラグ
ビット3: N ネガティブフラグ (演算結果の正負、結果のMSB)
ビット2: Z
ゼロフラグ
ビット1: V オーバーフローフラグ
ビット0: C
キャリーフラグ
PowerPC
PowerPCは「CR」(コンディションレジスター)と呼ばれ、4ビット8組で総計32ビットである。
8組のCRは、CR0からCR7まであり、演算の際にどのCRに結果を格納するかを選択できる。これは、分岐命令の前に複数の演算をあらかじめ実施しておくことができることを意味する。
ビット3: 負
ビット2: 正 (ゼロを含まない)
ビット1: ゼロ
ビット0: オーバーフロー
Intel
Itanium
(
IA-64
)
Intel ItaniumのIA-64は、複数命令を同時実行するため、一般的なフラグレジスターを用意しない。
代わりに、64ビット長でフラグ目的に使う汎用レジスターであるプレディケートレジスターを用意した。
比較命令は、プレディケートレジスターのどのビットに結果を格納するかを選択する。
条件分岐命令は、プレディケートレジスターの指定されたビットを参照する。
ルネサス
H8
8ビットで「CCR」(コンディションコードレジスター)と呼ばれた。
ビット7: I 割り込みマスクビット
ビット6: UI ユーザーフラグ/割り込みマスクフラグ
ビット5: H ハーフフラグ
ビット4: U ユーザーフラグ
ビット3: N ネガティブフラグ (演算結果の正負、結果のMSB)
ビット2: Z
ゼロフラグ
ビット1: V オーバーフローフラグ
ビット0: C
キャリーフラグ
ルネサス
SuperH
32ビットで「SR」(ステータスレジスター)と呼ばれた。
条件分岐のフラグは「T」しかなく、演算や比較命令を実行する際に条件をつけ、結果をTに入れる方式だった。
Microchip
PIC
レジスターファイルと呼ばれる領域の中に「STATUSレジスター」がある(ページ0で03h、ページ1で83h、ページ2で103h、ページ4で183h)。
ビット7: IRP
ビット6: RP1
ビット5: RP0
ビット4: TO タイムアウト
ビット3: PD パワーダウン
ビット2: Z ゼロ
ビット1: DC ディジットキャリー
ビット0: C キャリー
ARMアーキテクチャ
ARMではCPSR(カレントプログラムステータスレジスタ)と呼ばれている。
MIPSアーキテクチャー
MIPSアーキテクチャーにはフラグレジスター相当がない。
演算結果は常に汎用レジスターに格納され、分岐命令は汎用レジスターの値を参照して0か非0かによって動作する。
再検索