ステータスレジスタ
[Wikipedia|▼Menu]

ステータスレジスタ(: status register)は、コンピュータプロセッサなどにおいて、フラグビットの集まったワードをその内容とするレジスタである。フラグレジスタやフラグバイト、コンディションコードレジスタなどとも呼ばれる。

その仕様は一般に、プロセッサの命令セットと密接に結びついており、命令セットアーキテクチャ(ISA)毎に決まっている。
一般的なステータスレジスタの構成

一般にステータスレジスタは、そのプロセッサの命令による様々な演算などの結果などに関して「あふれが生じた」であるなどといったような対処が必要な場合がある事象に関する状態(ステータス)を示すフラグと、割込みなどといったシステムを制御する状態を示すフラグとから成る。但し、6502のように演算でなく、レジスタへのロードのみでステータスレジスタが変化するものもある[1]

演算結果を反映するものは、その後に条件分岐などとして参照される場合が多いが ARM のように全命令に条件フィールドがあり、条件付き実行が可能となっているCPUもある。条件分岐命令と組み合わせるか、条件付き実行命令との組み合わせにするか状況に応じて選択が可能である[2]。割込み禁止などのシステムを制御するフラグへのアクセスはOSなど(のみ)がおこなう「センシティブ命令」であるため、仮想化要件などが重視される近年のプロセッサでは(詳細は「PopekとGoldbergの仮想化要件」を参照のこと)扱いやすさのために同一のレジスタ内に共存させたりすることは避けられる(ないし、仮に実際のハードウェア内では共存していたとしても、システム的にユーザプロセスからは隔離されている)。

組込用や8ビット時代のパソコンのプロセッサなど、あるいはリセット直後で保護モードに入る前のモード等、区別が無い場合もある。
ステータスレジスタの実例

以下にいくつかのマイクロプロセッサでのステータスレジスタの例を挙げる。ビット位置はそれぞれのアーキテクチャでの慣例を無視し、LSBを0に統一している。「セット」は 1 の書き込み、「クリア」は 0 の書き込みである。説明がないフラグは既出の同じ名前のフラグと同じ働きである。フラグは一般にビット操作で扱う。マスクの記事も参照のこと。

また、命令とフラグの変化の仕方についてについての関係も、命令セットアーキテクチャ(ISA)ごとに異なる。各命令種について、一般に「フラグに影響を残さない命令の種類」「全てのフラグに影響を残す命令の種類」の2種類はほぼ全てのISAにあるが、他に「一部のフラグには影響し、残りのフラグには影響しない」という命令種があるISAも多い(しかし、そのような命令はOoO実行などを妨げるなど「悩みのタネ」になりやすく、Intel ADXのように拡張命令などで、従来の命令と基本的な動作は同じだがフラグへの影響範囲が異なる、といった命令が作られることもある)。
6502

6502のステータスレジスタのサイズは8ビットであり、フラグバイトと呼ばれた。

Bit 7. ネガティブフラグ:演算結果の正負を示す。ただし、6502の演算結果は常にAレジスタに格納されるため、結局はAレジスタのMSBを示している。つまり、ロードのみでもその値によってセットされる[1]

Bit 6. オーバーフローフラグ:演算結果が符号付き8ビットで表せる範囲を超えたことを示す。

Bit 5. 未使用。常に1。

Bit 4. ブレークフラグ:BRK割り込み発生を示す。6502にはBRKとIRQの二種類の割り込みがあり、それを識別するためのフラグである。

Bit 3. デシマルフラグ:セットするとBCDモードで動作する。

Bit 2. インタラプトフラグ:セットすると割り込みが禁止される。

Bit 1. ゼロフラグ:演算結果が 0 の時にセットされる。さらに、ロードのみでもその値によってセットされる[1]

Bit 0. キャリーフラグ:キャリー発生時およびボローが発生しなかった時にセットされる。

Z80

Z80のステータスレジスタのサイズは8ビットであり、フラグレジスタと呼ばれた。

Bit 7. S 符号フラグ。

Bit 6. Z ゼロフラグ。

Bit 5. 未使用。常に0。

Bit 4. H ハーフキャリーフラグ(パックBCD演算用)。

Bit 3. 未使用。常に0。

Bit 2. P/V パリティ・オーバーフローフラグ(8080ではP パリティ)。

Bit 1. N 減算フラグ(ADD命令で0、SUB命令で1になる。8080では未使用、常に0)。

Bit 0. C キャリーフラグ。

80868086のフラグレジスタ

8086のステータスレジスタのサイズは16ビットでありフラグレジスタと呼ばれ、Bit 7 ? Bit 0 は 8080/8085 の持つフラグとビットも内容も全く同じ。Bit 15 ? Bit 8 は、8086 特有のフラグビットで構成される[3]

Bit 15 - 12. 未使用

Bit 11. オーバーフローフラグ

Bit 10. ディレクションフラグ:ストリング操作命令で、ポインタの増減方向を示す。

Bit 9. インタラプトフラグ:クリアすると割り込みが禁止される。

Bit 8.トラップフラグ:シングルステップモードでの実行を制御する。

Bit 7. サインフラグ:演算結果の正負を示す。

Bit 6. ゼロフラグ

Bit 5. 未使用

Bit 4. 補助キャリーフラグ:BCD演算で使用されるキャリーフラグ

Bit 3. 未使用

Bit 2. パリティフラグ:演算結果の 1 となるビット数が偶数のときセットされ、奇数のときクリアされる。

Bit 1. 未使用

Bit 0. キャリーフラグ

Pentium

Pentiumのステータスレジスタのサイズは32ビットであり、EFLAGSレジスタと呼ばれた。

Bit 31 - 22. 未使用

Bit 21. IDフラグ:CPUID命令の使用を制御する。

Bit 20. 仮想割り込みペンディングフラグ:仮想86モードでの割り込み関連のフラグ

Bit 19. 仮想割り込みフラグ:仮想86モードでの割り込み関連のフラグ

Bit 18. アラインメントチェックフラグ:メモリアクセスのアラインメントチェックを制御するフラグ

Bit 17. 仮想86モードフラグ:仮想86モードの制御をするフラグ

Bit 16. レジュームフラグ:デバッグ関連の制御フラグ

Bit 15. 未使用

Bit 14. ネストタスクフラグ:タスクがネストしているかどうかを示す。

Bit 13 - 12. 割り込み特権レベルフラグ:動作中タスクの割り込み特権レベルを示す。

Bit 11. オーバーフローフラグ

Bit 10. ディレクションフラグ:

Bit 9. インタラプトフラグ:

Bit 8.トラップフラグ:

Bit 7. サインフラグ:

Bit 6. ゼロフラグ

Bit 5. 未使用

Bit 4. 補助キャリーフラグ:

Bit 3. 未使用

Bit 2. パリティフラグ:

Bit 1. 未使用

Bit 0. キャリーフラグ

68020

68020のステータスレジスタは16ビットで、上位8ビットをシステムバイト、下位8ビットをユーザバイトまたはコンディション・コード・レジスタ(CCR)と呼ぶ。

Bit 15 - 14. トレースモードフラグ:デバッグ用制御フラグ

Bit 13. スーパバイザフラグ:特権モードを示す

Bit 12. マスタフラグ:マルチプロセッサ構成用のフラグ

Bit 11. 未使用

Bit 10 - 8. 割り込みマスク:3ビットで8レベルの割り込みマスクを表す。

Bit 7 - 5. 未使用

Bit 4. 拡張フラグ:キャリーフラグとほぼ同じ意味

Bit 3. ネガティブフラグ

Bit 2. ゼロフラグ

Bit 1. オーバーフローフラグ

Bit 0. キャリーフラグ

R3000

MIPSアーキテクチャでは、ステータスレジスタが存在しない。これは、プログラムの流れを制御するにあたっては、分岐命令が条件付となっていて、レジスタ間の大小比較やゼロとの大小比較をした結果で分岐するかしないかを決めるために、ネガティブフラグやゼロフラグに相当するフラグを必要としない。この設計方針には以下のような思想がある。

演算を行うたびにステータスレジスタを設定することはパイプラインの設計を複雑にする。

演算そのものに余分な処理を追加しなくてはならなくなる。

演算するたびにステータスをチェックするようなプログラムはありえない。つまり、必要なときだけ比較すればよい。

また、オーバフローやキャリーに相当する分岐条件はないが、これらは例外トラップを発生させることでオペレーティングシステムに処理を任せている。ただし、ユーザプログラムがオーバーフローの発生時に対応する例外処理をOS側に事前に登録しておかなければならない。そうでなければそれらの例外を発生させたプロセスを停止させることになる。また、OSが介在するため頻繁にオーバフローを起こすと性能低下を招くため、基本的にはそれらの例外が発生しないようにプログラムを組むことになる。
PowerPC

PowerPCのステータスレジスタは、4ビットのフラグ8組から構成されており、コンディションレジスタ(CR0 - CR7)と呼ばれる。以下の一覧の左側は四則演算などの命令にupdate condition registerの指定(命令の後にピリオドを付ける。例えば符号付き16bit即値加算 addi なら addi. と指定する)でセットされる。

Bit 0. 負数 - 演算結果が負

Bit 1. 正数 - 演算結果が正 (0を含まず)

Bit 2. ゼロ - 演算結果が0

Bit 3. サマリオーバーフロー(XERレジスタのSOフィールドのコピー)

演算命令実行時にCR0 - CR7のどのコンディションレジスタに結果を反映させるか(またはどこにも反映させないか)を指定できる。また、指定した2つのコンディションレジスタ同士でビット単位の論理演算が可能で、その結果を反映させるコンディションレジスタも自由に指定でき、複数の大小比較と論理演算を事前に行っておき、ひとつの条件分岐で済ませてしまうことができる。条件分岐時にもどのコンディションレジスタのどの組を参照するかを指定できる。これにより、フラグ更新を伴う複数の演算を先に実施しておき、後で条件分岐を行うということが可能となる。
Itanium

Itaniumでは、従来のようなステータスレジスタは存在しない。というのもEPICアーキテクチャによって、複数の命令を同時に並行して実行するため、単一のステータスレジスタでは結果を保持することができないためである。そこで、Itaniumでは64ビット幅で各ビットが汎用のフラグとして使えるプレディケートレジスタを用意している。この使用方法は次のようになる。
比較命令で何らかの比較を行う。レジスタ間あるいはイミディエート値とレジスタの大小比較ができる。

比較命令では比較結果を2つのプレディケートレジスタに格納する。一方がセットされれば、もう一方はクリアされる。

各命令は、必ずチェックすべきプレディケートレジスタを指定する。

チェックすべきプレディケートレジスタが 0 の場合、その命令は実行しない。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:19 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef