フラグレジスタと条件分岐は、アセンブリ言語でプログラムの制御フローを管理するための重要な要素です。以下に、これらの概念とそれらの役割について詳しく説明します。
フラグレジスタ(Flags Register)
フラグレジスタは、CPU内部で状態を示すためのビットフィールドを持つレジスタです。これらのビットは、最近の命令の実行結果やプロセッサの状態を示します。フラグレジスタは、条件分岐やエラー処理、演算結果の確認などに使用されます。
主なフラグ
- ゼロフラグ(ZF: Zero Flag)
- 結果がゼロの場合にセットされます。
CMP AX, BX
命令などの比較命令で使用されます。 - 例:
CMP AX, BX
の結果がゼロであればZFがセットされる。
- キャリーフラグ(CF: Carry Flag)
- 算術演算でキャリー(繰り上がり)やボロー(繰り下がり)が発生した場合にセットされます。加算や減算の命令で使用されます。
- 例:
ADD AX, BX
で繰り上がりが発生した場合、CFがセットされる。
- オーバーフローフラグ(OF: Overflow Flag)
- 演算結果がレジスタのビット幅を超えた場合にセットされます。例えば、符号付き演算でオーバーフローが発生した場合。
- 例:
ADD AX, BX
で符号付きオーバーフローが発生した場合、OFがセットされる。
- サインフラグ(SF: Sign Flag)
- 結果の最上位ビット(符号ビット)がセットされている場合にセットされます。これは結果が負であることを示します。
- 例:
MOV AX, -1
でAXが負の値であれば、SFがセットされる。
- パリティフラグ(PF: Parity Flag)
- 演算結果の1ビットが偶数個ある場合にセットされます。偶数パリティを持つ場合に使用されます。
- 例:
MOV AL, 0x01
でALのビットパターンが偶数の1ビットであれば、PFがセットされる。
- トラップフラグ(TF: Trap Flag)
- デバッグモードで1命令ごとにトラップ(中断)を発生させるために使用されます。デバッグ時に有用です。
- 例:
STI
命令でトラップフラグが設定されると、次の命令実行時にトラップが発生する。
- 割り込みフラグ(IF: Interrupt Flag)
- 外部割り込みを許可するかどうかを制御します。IFがセットされていると割り込みが許可され、クリアされていると割り込みは無視されます。
- 例:
CLI
命令でIFがクリアされ、STI
命令でIFがセットされる。
条件分岐(Conditional Branching)
条件分岐命令は、フラグレジスタの状態に基づいてプログラムの実行フローを変更するために使用されます。これにより、プログラムは異なる条件に応じて異なるコードパスを実行できます。
主な条件分岐命令
- JE/JZ (Jump if Equal / Jump if Zero)
- ゼロフラグがセットされている(比較結果がゼロ)場合にジャンプします。
- 例:
JE LABEL
(直前の比較命令で結果がゼロの場合、LABELにジャンプ)
- JNE/JNZ (Jump if Not Equal / Jump if Not Zero)
- ゼロフラグがクリアされている(比較結果がゼロでない)場合にジャンプします。
- 例:
JNE LABEL
(直前の比較命令で結果がゼロでない場合、LABELにジャンプ)
- JG/JNLE (Jump if Greater / Jump if Not Less or Equal)
- 演算結果が負でなく、ゼロでない場合にジャンプします。符号付き比較に基づく。
- 例:
JG LABEL
(直前の比較命令で結果が大きい場合、LABELにジャンプ)
- JL/JNGE (Jump if Less / Jump if Not Greater or Equal)
- 演算結果が負の場合にジャンプします。符号付き比較に基づく。
- 例:
JL LABEL
(直前の比較命令で結果が小さい場合、LABELにジャンプ)
- JA/JNBE (Jump if Above / Jump if Not Below or Equal)
- キャリーフラグがクリアされている(符号なし比較で結果が大きい)場合にジャンプします。
- 例:
JA LABEL
(直前の比較命令で結果が大きい場合、LABELにジャンプ)
- JB/JNAE (Jump if Below / Jump if Not Above or Equal)
- キャリーフラグがセットされている(符号なし比較で結果が小さい)場合にジャンプします。
- 例:
JB LABEL
(直前の比較命令で結果が小さい場合、LABELにジャンプ)
まとめ
フラグレジスタは、演算や比較の結果に基づいてプログラムの状態を示し、条件分岐命令はその状態を基にプログラムの実行フローを制御します。これにより、アセンブリ言語のプログラムは動的な条件に応じた制御を行うことができます。