条件ジャンプとフラグ


フラグレジスタの内容

前回に引き続き、今回は条件付ジャンプを説明します
条件付ジャンプには、これまで何度が簡単に説明をした「フラグレジスタ」を用います

条件付ジャンプにはJump if Condition Is Metと呼ばれる命令セットを使います
これは、数多くのフラグの状態を調べるジャンプ命令がサポートされているので
より詳しく知りたいのならば、IntelのWebページからPDFファイルをDLしてください

フラグレジスタは16ビットの一つのレジスタで構成され
それぞれ1ビットずつに意味のあるフラグが存在しています
全てのフラグは1ビットで表現され、0か1かでその状態を表します

フラグレジスタ名前意味ONOFF
OFオーバーフロー符号付演算で桁あふれが発生OVNV
DFディレクションストリング操作命令で使用DNUP
IFインタラプト・
イネーブル
外部割込みの許可EIDI
TFトラップトレースで実行するときのフラグ
SFサイン演算結果の符号が負数NGPL
ZFゼロ演算結果がゼロZRNZ
AF補助キャリーBCD演算で使用されるキャリーACNA
PFパリティ演算結果で、各ビットで1となる
ビットの合計が偶数
PEPO
CFキャリー通常の演算結果で桁あふれが発生CYNC

これで、GコマンドやRコマンドで表示されるレジスタ一覧のフラグレジスタの値を読めますね
ディレクションフラグは、ストリング操作命令というものがあるのですが
そのストリング操作命令の解説のときに詳しく説明します

パリティフラグは、演算結果の数を2進数で考えて1となる数の合計が偶数ならセットされます
例えば、4はビットで 100 です。1の合計は1、つまり基数なのでセットされません
5や15のように、101 , 1111 という場合は1の合計が偶数なのでセットされます

これらのフラグはセットされた時点では何の効果も持ちません
これを条件ジャンプの条件として利用するのです。次に、条件ジャンプの命令を示します

命令ジャンプ条件 命令ジャンプ条件
JAより上(CF = 0 & ZF = 0) JAEより上か等しい(CF = 0)
JBより下(CF = 1) JBEより下か等しい(CF = 1 | ZF = 1)
JCキャリーがある(CF = 1) JCXZCXレジスタが0
JE等しい(ZF = 1) JGより大きい(ZF = 0 & SF = OF)
JGEより大きいか等しい(SD = OF) JLより小さい(SF ! OF)
JLEより小さいか等しい(ZF = 1 | SF ! OF) JNAより上でない(CF = 1 | ZF = 1)
JNAEより上でなく等しい(CF = 1) JNBより下でない(CF = 0)
JNBEより下でなく等しい(CF = 0 & ZF = 0) JNCキャリーがない(CF = 0)
JNE等しくない(ZF = 0) JNGより大きくない(ZF = 1 | SF ! OF)
JNGEより大きくなく等しくない(SF ! OF) JNLより小さくない(SF = OF)
JNLEより小さくなく等しくない (ZF = 0 & SF = OF) JNOオーバーフローがない(OF = 0)
JNPパリティがない(PF = 0) JNS符号がない(SF = 0)
JNZゼロではない(ZF = 0) JOオーバーフローがある(PF = 1)
JPパリティがある(PF = 1) JPEパリティが偶数(PF = 1)
JPOパリティが基数(PF = 0) JS符合がある(SF = 1)
JZゼロである(ZF = 1)

こうして見ると、命令は違うが動作が同じであるという命令がいくつかあります
実際に何が違うかというと、アセンブリでの構文が異なるだけで意味は同じです
例えば、JPとJPE(PF = 1) という条件ジャンプは機械語に訳すと同じ 7A となります

これらの条件ジャンプ命令は、条件がそろったときに指定したアドレスへジャンプします
ただし、条件ジャンプの場合は全てshortジャンプです
nearジャンプができないので、条件ジャンプは常に -128〜127 の範囲でのジャンプになります
-A 100
15F2:0100 MOV AX , 0
15F2:0103 MOV DX , FF
15F2:0106 INC AX
15F2:0107 DEC DX
15F2:0108 JNZ 106
15F2:010A

-G =100 10A

AX=00FF  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=15F2  ES=15F2  SS=15F2  CS=15F2  IP=010A   NV UP EI PL ZR NA PE NC
このプログラムは、まずAXレジスタを0に、DXレジスタにFFをロードし
AXレジスタをインクリメントし、次にDXレジスタをデクリメントします
最後に演算したDXレジスタのデクリメントの結果がフラグレジスタに残っている状態で
JNZ条件ジャンプを実行します

JNZはZFが0のときに実行するものです。つまり前のデクリメントの結果が0でなければ実行します
JNZが実行されると、オフセットアドレス 0106 まで戻って再びインクリメントとデクリメントを行います
これを繰り返して、DXレジスタが最終的に0になるとプログラムを終了します




前のページへ戻る次のページへ