ステータスレジスタ


Status_register
ステータスレジスタ、フラグレジスタ、又は条件コードレジスタ(CCRは)状態の集合であるフラグ ビットのためのプロセッサ。このようなレジスターの例には、x86アーキテクチャーのFLAGSレジスター、z / Architectureを介したIBMSystem / 360アーキテクチャーのプログラム状況ワード(PSW)レジスターのフラグ、およびARM Cortex-Aアーキテクチャーのアプリケーション・プログラム状況レジスター(APSR)が含まれます。。
ステータスレジスタは、プロセッサの状態に関する情報を含むハードウェアレジスタです。個々のビットは、プロセッサ上で実行されるマシンコード命令によって暗黙的または明示的に読み取りおよび/または書き込まれます。ステータスレジスタにより、命令は前の命令の結果に応じてアクションを実行できます。
通常、ステータスレジスタのフラグは、算術演算およびビット操作演算の効果として変更されます。たとえば、演算の結果がゼロの場合はZビットがセットされ、ゼロ以外の場合はクリアされます。他のクラスの命令も、ステータスを示すためにフラグを変更する場合がたとえば、文字列命令は、一致/不一致が見つかったため、または文字列の終わりが見つかったために命令が終了したかどうかを示すためにこれを行う場合がフラグは後続の条件付き命令によって読み取られるため、指定されたアクション(プロセッサ、ジャンプ、呼び出し、リターンなどに応じて)は、フラグが前の命令の指定された結果を示している場合にのみ発生します。
MIPSやAlphaなどの一部のCPUアーキテクチャは、専用のフラグレジスタを使用しません。他のものは、フラグを暗黙的に設定および/または読み取りません。このようなマシンは、命令間で暗黙のステータス情報をまったく渡さないか、明示的に選択された汎用レジスタに渡します。
ステータスレジスタには、より特殊なフラグ、割り込みイネーブルビット、および同様のタイプの情報など、他のフィールドも含まれることがよく割り込み中、現在実行中のスレッドのステータスは、ステータスレジスタの現在の値を、プログラムカウンタやその他のアクティブなレジスタとともに、マシンスタックまたはその他のメモリの予約領域に格納することで保持(および後で呼び出す)できます。

コンテンツ
1 共通のフラグ
2 その他のフラグ
3 算術フラグのないCPUアーキテクチャ
4 も参照してください
5 参考文献

共通のフラグ
これは、ほとんどすべての最新のプロセッサに実装されている、最も一般的なCPUステータスレジスタフラグのリストです。
国旗 名前 説明
Z ゼロフラグ 算術演算または論理演算(または場合によっては負荷)の結果がゼロであることを示します。キャリーフラグ 重要度の低いワードから重要度の高いワードの最下位ビットに2桁の数字を運ぶことにより、1ワードより大きい数値を加算/減算できるようにします。また、多くのプロセッサで同様の方法でビットシフトとローテーションを拡張するためにも使用されます(専用のXフラグを介して行われることもあります)。
S / N サインフラグ ネガティブフラグ 数学演算の結果が負であることを示します。一部のプロセッサでは、 NフラグとSフラグは異なる意味と使用法で区別されます。一方は最後の結果が負であったかどうかを示し、もう一方は減算または加算が行われたかどうかを示します。
V / O / W オーバーフローフラグ 演算の符号付き結果が大きすぎて、2の補数表現を使用してレジスタ幅に収まらないことを示します。

その他のフラグ
一部のプロセッサでは、ステータスレジスタに次のようなフラグも含まれています。
国旗 名前 説明
H / A / DC ハーフキャリーフラグ補助フラグディジットキャリー10進調整フラグ
最後の算術演算の結果として、ニブル間(通常はバイトオペランドの4ビットの半分の間)でビットキャリーが生成されたことを示します。このようなフラグは、一般に、バイナリハードウェアでBCD算術演算を実装する場合に役立ちます。パリティフラグ 最後の結果のセットビット数が奇数か偶数かを示します。
I 割り込みフラグ 一部のプロセッサでは、このビットは割り込みが有効かマスクされているかを示します。プロセッサにPDP-11などの複数の割り込み優先度レベルがある場合、現在のスレッドの優先度を示すためにいくつかのビットを使用して、より高い優先度に設定されたハードウェアによってのみ割り込みを許可できます。他のアーキテクチャでは、ビットは、割り込みが現在アクティブであり、現在のスレッドが割り込みハンドラの一部であることを示している場合がスーパーバイザーフラグ 2つ以上の保護リングを提供するプロセッサでは、ステータスレジスタの1つ以上のビットが、現在のスレッドのリングを示します(信頼性、または他のスレッドを妨げる可能性のある要求にオペレーティングシステムを使用する必要があるかどうか)。リングが2つしかないプロセッサでは、1ビットでスーパーバイザとユーザーモードを区別できます。

算術フラグのないCPUアーキテクチャ
ステータスフラグを使用すると、前の命令の結果に基づいて命令を実行できます。では、パイプラインのようなプロセッサ、スーパースカラや投機的なプロセッサ、これは作成することができます危険をその遅い処理またはそれらを回避するには、余分なハードウェアを必要としています。
一部の非常に長い命令ワードプロセッサは、ステータスフラグを省略します。単一の命令は、テストを実行し、そのテストのどの結果に対してアクションを実行するかを示します。たとえば、aをbと比較し、等しい場合はcにジャンプします。テストの結果は、後続の指示のために保存されません。
ステータスレジスタのもう1つの代替方法は、プログラムが要求したときにプロセッサ命令がステータス情報を汎用レジスタに格納することです。MIPS、AMD 29000、DEC Alpha、およびRISC-Vは、比較結果を単一ビットまたは0または1の数値として汎用レジスタに格納する比較命令を提供するアーキテクチャの例です。条件分岐はに基づいて動作します。汎用レジスタの値。
通常、比較命令は、同等性または符号付き/符号なしの大きさをテストします。他の条件をテストするために、プログラムは等価式を使用します。たとえば、MIPSには「キャリービット」はありませんが、マルチワード加算を実行するプログラムは、合計がオペランドよりも小さいかどうかをテストすることにより、レジスタのシングルワード加算がオーバーフローしたかどうかをテストできます。
#ALOW =ブロー+クロウ アッドゥ ALOW 、 打撃、 クロウ
#セットTMP = 1 ALOW <クロウ、それ以外の場合は0 sltu tmpに、 ALOW 、 クロウ アッドゥ ahigh 、 bhigh 、 CHIGH アッドゥ ahigh 、 ahigh 、 TMP
sltu命令セットtmpその2つの他のオペランドの指定された比較に基づいて、1または0です。(ここでは、汎用レジスタtmpは条件付きジャンプを管理するステータスレジスタとしては使用されません。むしろ、下位加算からのキャリーを示す可能な値1が上位ワードに加算されます。)
計算時に2つの加算がありb + c + tmp、どちらもキャリーを生成する可能性があるため、3つ以上のワードを加算する場合、このスキームは不便になりsltuます。キャリーは2つの命令で検出する必要が幸い、これら2つのキャリーはオーバーフローのリスクなしに相互に追加できるため、追加されたワードごとに5つの命令で状況が安定します。

も参照してください
制御レジスタ
CPUフラグ(x86)
フラグフィールド

参考文献
^ 「ARMインフォメーションセンター」。infocenter.arm.com 。
^ 「東芝900操作マニュアル第3章」(PDF)。
^ 「4/8/16 / 32Kバイトのインシステムプログラマブルフラッシュを備えたAtmel8ビットマイクロコントローラー-データセット」(PDF)。マイクロチップテクノロジー。
^ マシー、ジョン(1996-06-04)。「キャリービット;アーキテクトの罠」。