FLAGSレジスタは、 x86 CPUの現在の状態を保持するステータスレジスタです。フラグビットのサイズと意味はアーキテクチャに依存します。通常、このレジスタは算術演算の結果と、その時点でCPUの動作に課せられた制限に関する情報を反映します。これらの制限には、一部の割り込みのトリガーを禁止することや、特定のクラスの「特権」命令の実行を禁止することなどが含まれます。追加のステータスフラグは、メモリマッピングをバイパスし、算術オーバーフローが発生した場合にCPUが取るべきアクションを定義する場合があります。
キャリー、パリティ、補助キャリー (またはハーフ キャリー)、ゼロ、および符号フラグは、多くのアーキテクチャに含まれています (多くの最新の (RISC) アーキテクチャには、キャリーなどのフラグがありません。フラグを使用する場合でも、BCD 計算は一般的ではなくなり、x86-64のロング モードでもサポートが制限されているため、ハーフ キャリーはまれです)。
i286アーキテクチャでは、このレジスタは16ビット幅です。後継のEFLAGSレジスタとRFLAGSレジスタ(最近のx86-64)は、それぞれ32ビットと64ビット幅です。幅の広いレジスタは、以前のより小さなレジスタとの互換性を維持しています。
| Intel x86 FLAGSレジスタ[ 1 ] | ||||||
|---|---|---|---|---|---|---|
| 少し # | マスク | 略語 | 説明 | カテゴリ | =1 | =0 |
| 旗 | ||||||
| 0 | 0x0001 | CF | 旗を運ぶ | 状態 | CY(キャリー) | NC(キャリーなし) |
| 1 | 0x0002 | — | 予約済み、 EFLAGSでは常に1 [ 2 ] [ 3 ] | — | ||
| 2 | 0x0004 | PF | パリティフラグ | 状態 | PE(パリティイーブン) | PO(パリティ奇数) |
| 3 | 0x0008 | — | 予約済み[ 3 ] | — | ||
| 4 | 0x0010 | AF | 補助キャリー旗[ 4 ] | 状態 | AC(補助運搬) | NA(補助キャリーなし) |
| 5 | 0x0020 | — | 予約済み[ 3 ] | — | ||
| 6 | 0x0040 | ZF | ゼロフラグ | 状態 | ZR(ゼロ) | NZ(ゼロではない) |
| 7 | 0x0080 | SF | サイン旗 | 状態 | NG(ネガティブ) | PL(ポジティブ) |
| 8 | 0x0100 | TF | トラップフラグ(シングルステップ) | コントロール | ||
| 9 | 0x0200 | もし | 割り込み有効フラグ | コントロール | EI(割り込みを有効にする) | DI(割り込み無効) |
| 10 | 0x0400 | DF | 方向旗 | コントロール | DN(ダウン) | UP(アップ) |
| 11 | 0x0800 | の | オーバーフローフラグ | 状態 | OV(オーバーフロー) | NV(オーバーフローなし) |
| 12~13 | 0x3000 | IOPL | I/O 特権レベル(286+ のみ)、8086 および 186 では常にすべて 1 | システム | ||
| 14 | 0x4000 | NT | ネストされたタスクフラグ(286+のみ)、8086と186では常に1 | システム | ||
| 15 | 0x8000 | 医学博士 | モードフラグ(NEC Vシリーズのみ)[ 5 ] 、すべてのIntel CPUで予約済み。8086 /186では常に1、286以降では0。 | コントロール | (NECのみ)ネイティブモード( 186互換) | (NECのみ)エミュレーションモード( 8080互換) |
| EFLAGS | ||||||
| 16 | 0x0001 0000 | 無線周波数 | 再開フラグ(386以上のみ) | システム | ||
| 17 | 0x0002 0000 | 仮想マシン | 仮想 8086 モードフラグ (386+ のみ) | システム | ||
| 18 | 0x0004 0000 | 交流 | アライメント チェック (486+、リング 3)、SMAPアクセス チェック ( Broadwell +、リング 0-2) | システム | ||
| 19 | 0x0008 0000 | VIF | 仮想割り込みフラグ(Pentium+) | システム | ||
| 20 | 0x0010 0000 | VIP | 仮想割り込み保留中(Pentium+) | システム | ||
| 21 | 0x0020 0000 | ID | CPUID命令が使用可能(Pentium+) | システム | ||
| 22~29 | 0x3FC0 0000 | — | 予約済み | — | ||
| 30 | 0x4000 0000 | (なし) | AESキースケジュールロードフラグ[ 6 ] ( VIA PadLock搭載CPUのみ) | システム | ||
| 31 | 0x8000 0000 | 人工知能 | 代替命令セット対応(VIA C5XLプロセッサのみ)[ 7 ] | システム | ||
| RFLAGS | ||||||
| 32-63 | 0xFFFF FFFF… …0000 0000 | — | 予約済み | — | ||
注: 表のマスク列は、FLAGS レジスタ値内のフラグを照会するための ANDビットマスク( 16 進数値) です。
すべてのFLAGSレジスタには、条件コード(ある機械語命令の結果を別の命令に反映させるフラグビット)が格納されます。算術命令と論理命令は、これらのフラグの一部またはすべてをセットします。条件ジャンプ命令は、特定のフラグの値に基づいて様々な動作を実行します。例えば、jz(ゼロの場合ジャンプ)、jc(キャリーの場合ジャンプ)、jo(オーバーフローの場合ジャンプ)は、特定のフラグに依存します。その他の条件ジャンプは、複数のフラグの組み合わせをテストします。
FLAGSレジスタはスタックから移動したり、スタックから移動したりできます。これは、割り込みサービスルーチンなど、レジスタへの変更が呼び出しコードに認識されてはならないルーチンに対して、CPUコンテキストの保存と復元を行う処理の一部です。関連する命令は以下のとおりです。
64ビットモードでは、PUSHF/POPFとPUSHFQ/POPFQは使用できますが、PUSHFD/POPFDは使用できません。[ 8 ]:4–349、4–432
FLAGS レジスタの下位 8 ビットは、SAHF および LAHF (AH をフラグにロード/ストア) による直接ロード/ストア操作にも使用できます。
FLAGSレジスタのプッシュとポップの機能により、プログラムは機械語命令では不可能な方法でFLAGSレジスタ内の情報を操作できます。例えば、cld命令stdはそれぞれ方向フラグ(DF)をクリアおよびセットしますが、DFを補完する命令はありません。これは、次のアセンブリコードで実現できます。
; これは 8086 コードで、16 ビット レジスタがスタックにプッシュされます。; この CPU では、フラグ レジスタは 16 ビットのみです。pushf ; スタックを使用して FLAGS を転送します。pop ax ; … を AX レジスタにプッシュします。 push ax ; それらをスタックにコピーして保存します。xor ax , 400h ; DF のみをトグル (反転、'補数') します。他のビットは変更されません。 push ax ; 再びスタックを使用して、変更された値を移動します。popf ; … を FLAGS レジスタにプッシュします。 ; ここで、DF フラグを補数にする必要のあるコードを挿入します。 popf ; FLAGS の元の値を復元します。FLAGSレジスタを操作することで、プログラムは搭載されているプロセッサのモデルを特定できます。例えば、アライメントフラグは486以降でのみ変更できます。プログラムがこのフラグを変更しようとして、変更が保持されなかったと判断された場合、そのプロセッサは486より前のバージョンです。
Intel Pentium以降、CPUID命令はプロセッサモデルを報告します。ただし、上記の方法は以前のモデルを区別するのに依然として有用です。