FLAGS レジスタは、x86 CPUの現在の状態を含むステータス レジスタです。フラグ ビットのサイズと意味はアーキテクチャによって異なります。通常、算術演算の結果と、現時点で CPU 操作に課せられている制限に関する情報を反映します。これらの制限には、一部の割り込みのトリガーを禁止することや、「特権」命令のクラスの実行を禁止することなどが含まれます。追加のステータス フラグは、メモリ マッピングをバイパスし、算術オーバーフローに対して CPU が実行するアクションを定義する場合があります。
キャリー、パリティ、補助キャリー (またはハーフ キャリー)、ゼロ、および符号フラグは、多くのアーキテクチャに含まれています (多くの最新の (RISC) アーキテクチャには、キャリーなどのフラグがありません。フラグを使用する場合でも、BCD 計算は一般的ではなくなり、x86-64のロング モードでもサポートが制限されているため、ハーフ キャリーはまれです)。
i286アーキテクチャでは、レジスタの幅は16 ビットです。その後継であるEFLAGSレジスタとRFLAGSレジスタ (最新のx86-64の場合) の幅は、それぞれ32 ビットと64 ビットです。幅の広いレジスタは、より小さい先行レジスタとの互換性を維持しています。
旗
注: 表のマスク列は、FLAGS レジスタ値内のフラグを照会するための ANDビットマスク( 16 進数値) です。
使用法
すべての FLAGS レジスタには、条件コード ( 1 つのマシン言語命令の結果が別の命令に影響を与えるフラグ ビット) が含まれています。算術命令と論理命令は一部またはすべてのフラグを設定し、条件ジャンプ命令は特定のフラグの値に基づいてさまざまなアクションを実行します。たとえば、jz(ゼロの場合ジャンプ)、jc(キャリーの場合ジャンプ)、およびjo(オーバーフローの場合ジャンプ) は特定のフラグに依存します。その他の条件ジャンプは、複数のフラグの組み合わせをテストします。
FLAGS レジスタはスタックから、またはスタックへ移動できます。これは、レジスタへの変更が呼び出しコードに表示されないようにする割り込みサービス ルーチンなどのルーチンに対して、CPU コンテキストを保存および復元する作業の一部です。関連する命令は次のとおりです。
- PUSHF 命令と POPF 命令は 16 ビットの FLAGS レジスタを転送します。
- PUSHFD/POPFD ( i386アーキテクチャで導入) は、32 ビットのダブル レジスタ EFLAGS を転送します。
- PUSHFQ/POPFQ ( x86-64アーキテクチャで導入) は、64 ビットのクワッドワード レジスタ RFLAGS を転送します。
64ビットモードでは、PUSHF/POPFとPUSHFQ/POPFQは使用可能だが、PUSHFD/POPFDは使用できない。[8] : 4–349, 4–432
FLAGS レジスタの下位 8 ビットは、SAHF および LAHF (AH をフラグにロード/ストア) による直接ロード/ストア操作にも使用できます。
例
FLAGS レジスタをプッシュおよびポップする機能により、プログラムは、マシン言語命令が存在しない方法で FLAGS 内の情報を操作できます。たとえば、命令cldと命令は、それぞれ方向フラグ (DF) をクリアおよび設定しますが、DF を補完する命令はありません。これは、次のアセンブリ コードstdで実現できます。
; これは 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命令によってプロセッサ モデルが報告されます。ただし、上記の方法は以前のモデルを区別するのに依然として役立ちます。
参照
参考文献
- ^ Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル(PDF)。第 1 巻。2012 年 5 月。pp. 3–21。
- ^ Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル(PDF)。第 1 巻。2016 年 12 月。p. 78。
- ^ abc 「シリコンリバースエンジニアリング:8085の文書化されていないフラグ」www.righto.com 。 2018年10月21日閲覧。
- ^ Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル、第 1 巻。2022 年 12 月。3 ~ 16 ページ。
- ^ NEC、16 ビット V シリーズ ユーザーズ マニュアル、文書番号 U11301E、2000 年 9 月、p. 186
- ^ VIA、PadLock プログラミング ガイド、v1.66、2005 年 8 月 4 日、7-8 ページ。2010 年 5 月 26 日時点のオリジナルよりアーカイブ。
- ^ VIA、VIA C3 プロセッサ代替命令セット アプリケーション ノート、バージョン 0.24、2002 - EFLAGS.AI フラグの詳細については、12 ページの図 2 と 21 ページの第 4 章を参照してください。
- ^ Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル(PDF)。第 2B 巻。2012 年 5 月。
