• 検索結果がありません。

IA-32 インテル ®

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アーキテクチャの進展にあわせて数々のフラグが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 システム・フラグを表す。

予約済みビット位置。使用してはならない。

必ず、前に読み込まれた値にセットすること。

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フラグがクリアされると、ストリング命令は自動的にインクリメントされる(スト リングを下位アドレスから上位アドレスに向かって処理する)。

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モードがイネーブルになる。クリアされると、保護モー ドに戻る。

AC(ビット 18) Alignment check flag(アライメント・チェック・フラグ)。このフラグ

とCR0レジスタのAMビットがセットされると、メモリ参照において アライメント・チェックがイネーブルになる。このフラグとAMビット のいずれかまたは両方がクリアされると、アライメント・チェックは ディスエーブルになる。

VIF(ビット 19) Virtual interrupt flag(仮想割り込みフラグ)。IFフラグの仮想イメージ。

VIPフラグとともに使用する。(このフラグとVIPフラグを使用するに は、制御レジスタCR4の VMEフラグをセットすることにより、仮想 モード拡張をイネーブルにしなければならない。)

VIP(ビット 20) Virtual interrupt pending flag(仮想割り込み保留フラグ)。ペンディング

状態の割り込みがある場合にセット、またはペンディング状態の割り込み がない場合にクリアされる。(このフラグは、ソフトウェアによってセッ トしクリアする。プロセッサは、読み取るだけである。)このフラグは、

VIFフラグとともに使用される。

ID(ビット 21) Identification flag(識別フラグ)。プログラムがこのフラグをセットする

かクリアできれば、CPUID命令がサポートされることを表す。

こられのフラグの詳細な説明については、『IA-32 インテル® アーキテクチャ・ソフトウェア・デベ ロッパーズ・マニュアル、下巻』の第3章「保護モードにおけるメモリ・マネージメント」を参照のこと。

3 .5 . 命令ポインタ

命令ポインタ(EIP)レジスタは、(現在のコード・セグメント内にある)次に実行される命令用の オフセットを格納する。このオフセットは、直線的コードにおいては1つの命令境界から次の命令境 界へと順番に進められる。一方、JMP、Jcc、CALL、RET、IRETなどの命令の実行時には、多くの 命令分前方または後方に進められる。