3-4.フラグ ( Flag ) へ ←前へ :  INDEX :  次ページへ→

フラグレジスタ ( EFLAGS )

EFLAGSレジスタの構成を次に示します。
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
AC
VM
RF
NT
IOPL
OF
DF
IF
TF
SF
ZF
AF
PF
CF
ACは80486以降

ACビット ( Alignment check ) :アラインメント検査

ACビットは、80486以降のCPUだけに存在します。 AC=1ならば、全てのメモリ参照がアライン(整列)しているものとみなします。 1つのオペランドを参照するための最少メモリ アクセス回数は、1回です。 ハードウェア メモリ インターフェースの動作を考慮すると、32ビット オペランドはメモリ アドレスが4で割りきれる数で始めなければなりません。 それ以外の場合は、オペランドを読むために、メモリ サイクルが2回必要になります。 AC=0ならば、単純に必要な読み出しサイクルを発生させるので効率が低下します。 これは、80386用の互換モードです。 しかし、AC=1ならば、80486以降のCPUは、CPUが効率的に走行するようにプログラムがコード化されているとみなし、それに違反した場合には、整列(アラインメント)例外(INT 17H)を発生させます。 16ビット オブジェクトと80286互換セレクタは、偶数アドレス境界に整列される必要があります。 ダブル(ロング実数)および拡張精度(テンプ実数)の浮動小数点数値は、メモリ アドレスを8で割り切れるように整列される必要があります。 ただし、ACビットは、特権レベル3のアプリケーション プログラムで走るコードにのみ適用されます。

VMビット ( Virtual 8086 mode ) :仮想8086モード

VMビットがセット(=1)されていると、現在実行されている命令が8086のコードであることを示します。 この状態を仮想8086モードといいます。アプリケーションがVM(Virtual Machine)ビットを書き換えることはできません。 また、EFLAGSを変更する命令でも、VMビットだけは変更できません。 タスク スィッチ操作、割り込み発生時、割り込みから戻る場合に,VMビットが更新されます。

RFビット ( Resume flag ) :回復フラグ

このビットは、命令を実行中にデバッグ例外を発生させてよいかを制御します。 プログラム実行中に例外が発生すると、プロセッサは現在のCS,EIPおよびEFLAGSレジスタをスタック上にプッシュし、特殊例外ハンドラに切り換えます。 スタックにプッシュされたEFLAGSレジスタのRFビットは1になります。 例外ハンドラから割り込まれた命令に戻ると、RFビットは1となり、デバッグ例外の再発生を防ぎます。 他の例外(ページ例外や保護例外など)は、通常に扱われます。 デバッグ例外は、例外の中で最も優先順位の高いものなので、もしも、ある命令が複数のフォールトを引き起こすと、最初に処理されるのがデバッグ例外となります。 割り込まれた命令に制御が戻るとRFビットがセットされ、再びデバッグ例外を引き起こすことなく命令が完了されます。 プロセッサは割り込まれた命令の完了と共にRFビットをクリアします。

NTビット ( Nested task flag ) :ネステェッド タスク フラグ

CALL、割り込み、トラップ時、およびタスク スィッチを引き起こすその他の例外時に、このビットをセットします。 NTビットは新しいタスクのEFLAGSレジスタの中でセットされ、IRETによるタスク スィッチが有効であることを知らせます。

IOPL ( l/O privilege level ) :I/O特権レベル

この2ビットは0から3の値で特権レベルがI/O命令の実行を要求していることを表します。 I0PLはEFLAGSの中にありますが、特権レベル0のプロシージャだけがこれを変更することができます。 これが変更されるのはPOPF, POPFD命令が使われたときだけです。 IN, INS, OUT, OUTS, CLI, STIの命令のどれかを実行するためには、プロシージャの現在の特権レベル(CPL)がIOPL以上(CPL≦IOPL)でなければなりません。 これらの命令を実行できるプロシージャをl/O特権を持つといいます。
注: 特権レベルが高いということは、CPL, RPL, IOPLの値では小さいという意味になります。(これらの値が小さいほど、レベルが高い)

OFビット ( Overflow flag ) :オーバーフロー フラグ

整数の算術演算命令が実行された場合、その結果がディスティネーション レジスタやメモリに対して大きすぎたり小さすぎたりすると、OFビットがセット(=1)されます。 OFビットは整数命令に対して設定されます。 CPUはディスティネーション レジスタのビット数をサイン(符号)ビットを除いたビット数で数えるため、絶対値部分が1ビット分少なくなります。次にその例を示します。
MOV  AL,127    ;
AL=7FH、符号付きバイト整数の最大値を設定。
ADD  AL,2      ;
AL=81H(-127)でOF=1となります。もしAXならばAX=0081H(129)で正常に扱えます。
MOV  CX,-35000 ;
CX=7748Hを設定していまいます。
SUB  CX,7002   ;
CX=5BEEH(42002)でOF=0となりますが、予測される結果になりません。もしECXならばECX = FFFF5BEEH(-42002)で予測される結果となります。
OFビットは、符号無し演算かどうかは考慮しません。 例えば、ALレジスタで127+2を行えば、結果は129という符号無しで正常に得られます。

DFビット ( Direction flag ) :ディレクション(方向)フラグ

DFビットは、MOVS, STOS, LODS, CMPS, SCAS, INS, OUTSなどのストリング操作命令の動きを制御します。 DF=0ならば、ストリング命令は上位アドレス方向へ進行しながら実行されます。 DF=1ならば、メモリ アドレスは減じられ、オペランドのアドレスは下位方向へ進みます。 STD命令はディレクション フラグをセット(=1)し、CLD命令がこのビットをクリア(=0)します。

IFビット ( Interrupt enable flag ) :割り込み許可フラグ

このビットがセット(=1)されると、CPUは外部のハードウェア割り込みに応答します。 クリア(=0)されると割り込み禁止となり、ハードウェア割り込みを無視します。 ただし、このビットはNMI割り込みには影響を及ぼしません。 同様に、フォールト(例外)とソフトウェア割り込みに対しては、IFビットの値に関わらず、常に応答します。 IFビットが0であることを、マスクされているといいます。 STI命令はIFビットを1にし、CLI命令は0にします。IFビットはIRET命令を実行したときにも変更されます。 POPFおよびPOPFD命令は、命令を実行しているプロシージャがI/0特権を持っているときに限り、IFビットを変更します。

TFビット ( Trap flag ) :トラップ フラグ

TFビットは、アプリケーションのデバッグ補助を行います。 TF=1ならば、次の命令を実行後すぐに例外が発生します。 トラップ フラグは通常、デバッガによってセットされ、シングル ステップに利用されます。

SFビット ( Sign flag ) :サイン(符号)フラグ

SFビットは、算術演算や論理演算命令などが実行されたときに変化します。 このビットは演算結果の最上位ビットのコピーとなります。 もし1がセットされていれば演算結果が負の数であることを意味します。

MOV  EDX,-1 ;
MOV命令ではSFは変化しません。
ADD  EDX,3  ;
EDX=2でSFが0になります。
NEG  EDX    ;
EDX=-2となりSFが1に変化します。

ZFビット ( Zero flag ) :ゼロ フラグ

ZFビットは算術演算命令などでの結果が0になるとセット(=1)されます。

MOV  AL,0  ;
MOV命令ではZFは変化しません。
OR   AL,AL ;
論理和命令でAL=0なのでZF=1に変化します。

AFビット ( Auxiliary carry flag ) :補助キャリー フラグ

AFビットは、算術演算命令においてALレジスタの下位4ビットから繰り上がりが生じたことを示します。 このビットはASCIIやBCD命令で使用されます。 これにより複数桁の10進演算が可能になります。次の例はASCIIコードのキャラクタ4と7を扱ったものです。

MOV  AL,'4' ;
AL=34Hを設定、MOV命令ではAFは変化しません。
ADD  AL,'7' ;
AL=6BHで、AFが1に変化します。
AAA         ;
ASC11補正で、AL=1, AH=AH+1となります。

PFビット ( Parity flag ) :パリティ フラグ

PFビットは、算術演算命令の結果の各ビットを調べ、1のビットが偶数個あればセット(=1)します。 例えば、次の命令では、結果としてPFビットは1になります。

MOV  AH,91H ;
AH=10010O01Bを設定、MOV命令ではPFは変化しません。
ADD  AH,05H ;
AH=10010110Bとなり、PFは1に変化します。

CFビット ( Carry flag ) :キャリー フラグ

CFビットは、算術演算を行った結果がディスティネーション レジスタやメモリに対して大きすぎたり小さすぎたときにセットされます。 OFビットと似ていますが、ディスティネーションに対する符号無しのオーバーフローを意味します。

MOV  AL,127 ;
AL=7FHを設定、MOV命令ではCFは変化しません。
ADD  AL,2   ;
AL=81Hとなり、CFは0に変化します。
ADD  AL,AL  ;
AL=02Hとなり、CFは1に変化します。(102Hとなりバイト範囲をオーバー)
MOV  AL,3   ;
AL=03Hを設定、MOV命令ではCFは変化しません。
SUB  AL,4   ;
AL=FFHとなり、CFは1に変化します。(ボローが発生)


3-4.フラグ ( Flag ) へ ←前へ :  INDEX :  次ページへ→