3.4. 基本プログラム実行レジスタ
3.4.3. EFLAGS レジスタ
32
ビットのEFLAGS
レジスタには、1
群のステータス・フラグ、1
つの制御フラグ、1
群のシステムフラグが格納される。このレジスタの各フラグの定義を、図3-7.
に示す。RESET
ピンかINIT
ピンをアサートしてプロセッサを初期化すると、EFLAGS
レジス タのステートは00000002H
になる。このレジスタのビット1
、3
、5
、15
、22
~31
は予 約済みであるため、ソフトウェア上でこれらのビットを使用したりビットのステート に依存することは避けなければならない。EFLAGS
レジスタのフラグの一部は、特殊な命令(次項以降で説明)を使用すれば、直接変更できる。レジスタ全体のチェックや変更を直接行う命令はない。LAHF、
SAHF、PUSHF、PUSHFD、POPF、POPFD
などの命令を使用すれば、プロシージャ・スタックあるいは
EAX
レジスタとの間でフラグのグループを移動できる。EFLAGS
レ ジスタの内容をプロシージャ・スタックあるいはEAX
レジスタに転送した後は、プロ セッサのビット操作命令(BT、BTS、BTR、BTC)を使用してフラグのチェックや変 更を実行できる。プロセッサのマルチタスク機能を使用してタスクがサスペンドされる場合は、プロ
セッサは
EFLAGS
レジスタのステートを、サスペンドされるタスク用のタスク・ステート・セグメント(TSS)に自動的にセーブする。プロセッサは、自身を新規タス クに結合する際に、EFLAGSレジスタに、新規タスクの
TSS
からのデータをロードす る。割り込みまたは例外ハンドラ・プロシージャへのコールがかけられると、プロセッサ
は
EFLAGSレジスタのステートを、プロシージャ・スタック上に自動的にセーブする。
割り込みまたは例外がタスクスイッチで処理される場合は、
EFLAGS
レジスタのス テートは、サスペンドされているタスク用のTSS
にセーブされる。IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
3-16
IA-32
アーキテクチャの進展にあわせて数々のフラグがEFLAGS
レジスタに追加されてきたが、既存のフラグの機能や位置は、IA-32プロセッサのどのファミリにおいて も同じである。このため、コード上であるファミリに属する
IA-32
プロセッサ向けに これらのフラグにアクセスしたりフラグを変更するように書かれていても、それ以降 のファミリに属するプロセッサ上でも問題なく動作する。3.4.3.1. ステータス・フラグ
EFLAGS
レジスタのステータス・フラグ(ビット0
、2
、4
、6
、7
、11
)は、ADD
、SUB
、MUL
、DIV
などの算術命令の結果を示す。ステータス・フラグの機能を次に示す。CF(ビット 0) Carry Flag(キャリーフラグ)。算術演算では、結果の最上位ビット
でキャリーまたはボローが生じた場合にセットされ、生じなかった場 合にはクリアされる。このフラグは、符号なし整数演算でのオーバー フロー状態を示す。このフラグはまた、多倍精度演算においても使用 される。
PF(ビット 2) Parity flag(パリティフラグ)。結果の最下位バイトに値1のビット
が偶数個含まれている場合にセットされ、奇数個の場合にはクリアさ れる。
図3-7. EFLAGSレジスタ
31302928 27 26 25 24 23 22 21 20 19 18 17 16
0 R
F I
D A C V
M
X Virtual-8086 Mode (VM) X Resume Flag (RF) X Nested Task (NT) X I/O Privilege Level (IOPL) S Overflow Flag (OF) C Direction Flag (DF) X Interrupt Enable Flag (IF) X Alignment Check (AC) X ID Flag (ID)
X Virtual Interrupt Pending (VIP)
15141312 11 10 9 8 7 6 5 4 3 2 1 0
0 C
F A F
P F 1 D
F I F
T F
S F Z F N
T 0 0
0 0 0 0 0 0 0 0 0 V
I P
V I F
O F I O P L
X Virtual Interrupt Flag (VIF)
X Trap Flag (TF) S Sign Flag (SF) S Zero Flag (ZF)
S Auxiliary Carry Flag (AF) S Parity Flag (PF) S Carry Flag (CF)
S ステータス・フラグを表す。
C 制御フラグを表す。
X システムフラグを表す。
予約済みビット位置。使用してはならない。
必ず、前に読み込まれた値にセットすること。
IA-32基本実行環境
3
AF(ビット 4) Adjust flag(調整フラグ)。算術演算では、結果のビット 3 にキャ
リーまたはボローが生じた場合にセットされ、生じなかった場合には クリアされる。このフラグは、2進化10進(BCD)演算で使用される。
ZF(ビット 6) Zero flag(ゼロフラグ)。結果がゼロの場合にセットされ、ゼロでな
い場合にクリアされる。
SF(ビット 7) Sign flag(符号フラグ)。符号付き整数の符号ビットである結果の最
上位ビットと同じ値にセットされる。(0は正の値を、1は負の値を示 す。)
OF(ビット 11) Overflow flag(オーバーフロー・フラグ)。整数の演算結果が大き
すぎる正の数であるか、小さすぎる負の数で、デスティネーション・
オペランドに収まらない場合(符号ビットは除く)にセットされ、そ うでない場合にクリアされる。このフラグは、符号付き整数(2の補 数)演算でのオーバーフロー状態を示す。
これらのステータス・フラグのなかで、STC、CLC、CMCの各命令を使用して直接変 更できるのは、CFフラグだけである。CFフラグに指定のビットをコピーするには、
ビット命令(BT、BTS、BTR、BTC)を使用する。
ステータス・フラグを使用すれば、単一の算術演算で
3
つの異なるデータ型(符号な し整数、符号付き整数、BCD
整数)に対して結果を生成できる。算術演算の結果が符 号なし整数として処理される場合は、CF
フラグが範囲外状態(キャリーあるいはボ ロー)を示す。符号付き整数(2
の補数)として処理される場合は、OF
フラグがキャ リーあるいはボローを示す。BCD
数として処理される場合は、AF
フラグがキャリー あるいはボローを示す。SF
フラグは、符号付き整数の符号を示す。ZF
フラグは、符 号付き整数または符号なし整数でのゼロを示す。整数に対して多倍精度演算を実行する場合は、
CF
フラグがADC
(Add with Carry
)命 令やSBB
(Subtract with Borrow
)命令と共に使用され、キャリーあるいはボローを計 算間で伝達する。Jcc
(Jump on Condition Code
cc)、SETcc
(Byte Set on Condition
cc)、LOOPcc
、CMOVcc
(
Conditional Move
)などの条件付き命令では、1
つ、または複数のステータス・フラ グを条件コードとして使用し、分岐、セットバイト、エンドループなどの条件をテス トする。3.4.3.2. DFフラグ
DF(Direction Flag(方向フラグ)、EFLAGS
レジスタのビット10
にある)は、ストリ ング命令(MOVS、CMPS、SCAS、LODS、およびSTOS)を制御する。DF
フラグが セットされると、ストリング命令は自動的にデクリメントされる(ストリングを上位 アドレスから下位アドレスに向かって処理する)。DFフラグがクリアされると、スト リング命令は自動的にインクリメントされる(ストリングを下位アドレスから上位ア ドレスに向かって処理する)。IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
3-18
DF
フラグは、STD
命令を使ってセットし、CLD
命令を使ってクリアする。3.4.4.
システムフラグとIOPL
フィールドEFLAGS
レジスタのシステムフラグとIOPL
フィールドを使って、オペレーティング・システムやエグゼクティブの動作を制御する。これらは、アプリケーション・プログ ラム上で変更してはならない。これらのステータス・フラグは、それぞれ次の機能を 持つ。
IF(ビット 9) Interrupt Enable Flag(割り込み可能フラグ)。マスク可能な割り込 みリクエストに対するプロセッサの応答を制御する。これがセットさ れると、プロセッサはマスク可能割り込みに応答する。クリアされる と、マスク可能割り込みは無効になる。
TF(ビット 8) Trap flag(トラップフラグ)。これがセットされると、デバッグにお
いてシングル・ステップ・モードがイネーブルになる。クリアされる と、シングル・ステップ・モードがディスエーブルになる。
IOPL(ビット 12 、13)I/O privilege level field(I/O特権レベル・フィールド)。現在実 行されているプログラムあるいはタスクのI/O特権レベルを示す。現 在実行され ているプロ グラムあるい はタスクの現 行特権レベ ル
(CPL)は、I/Oアドレス空間をアクセスするためのI/O特権レベルに 等しいか、小さくなければならない。このフィールドは、CPL=0 で 動作している場合に限り、POPF命令とIRET命令を使って変更でき る。
NT(ビット 14) Nested Task Flag(ネスト・タスク・フラグ)。割り込まれたタス
クやコールされたタスクのチェーン結合を制御する。現在のタスクが 直前に実行されたタスクにリンクされている場合にセットされ、現在 のタスクが別のタスクにリンクされていない場合はクリアされる。
RF(ビット 16) Resume flag(再開フラグ)。デバッグ例外に対するプロセッサの応
答を制御する。
VM(ビット 17) Virtual-8086 mode flag(仮想8086モードフラグ)。これがセット されると、仮想 8086 モードがイネーブルになる。クリアされると、
仮想8086モードのセマンティクスなしで保護モードに戻る。
AC(ビット 18) Alignment check flag(アライメント・チェック・フラグ)。この フラグとCR0レジスタのAMビットがセットされると、メモリ参照 においてアライメント・チェックがイネーブルになる。このフラグと AMビットのいずれかまたは両方がクリアされると、アライメント・
チェックはディスエーブルになる。
VIF(ビット 19) Virtual interrupt flag(仮想割り込みフラグ)。IFフラグの仮想イメー ジ。VIPフラグと共に使用する。(このフラグとVIPフラグを使用す るには、制御レジスタCR4のVMEフラグをセットすることにより、
仮想モード拡張をイネーブルにしなければならない。)
VIP(ビット 20) Virtual interrupt pending flag(仮想割り込み保留フラグ)。ペンディ ング状態の割り込みがある場合にセット、またはペンディング状態の
IA-32基本実行環境
3
割り込みがない場合にクリアされる。(このフラグは、ソフトウェアに よってセットしクリアする。プロセッサは、読み取るだけである。)こ のフラグは、VIFフラグと共に使用される。
ID(ビット 21) Identification flag(識別フラグ)。プログラムがこのフラグをセット するかクリアできれば、CPUID命令がサポートされることを表す。
こられのフラグの詳細な説明については、『IA-32 インテル®
アーキテクチャ・ソフト
ウェア・デベロッパーズ・マニュアル、下巻』の第3
章「保護モードにおけるメモリ・マネージメント」を参照のこと。