IF-ELSEIF-ELSE-ENDIF (ドットなし) はコンパイル時のディレクティブです。アセンブラは条件をテストし、結果に基づいて、ステートメントのシーケンスの 1 つだけを結果のプログラムに含めます。これらは、 C プリプロセッサ ディレクティブ#if
、、、、および と同じ目的を果たします。#elif
#else
#endif
.IF-.ELSEIF-.ELSE-.ENDIF (ドット付き) は実行時のディレクティブです。アセンブラは、比較命令とジャンプ命令を生成します。これらは、形式の C ステートメントと同じ目的を果たしif (...) { ... } else if (...) { ... } else { ... }
ます。
注:私は masm に精通していないため、これらの例の表記には誤りがある可能性があります。
something EQU 1
somewhere:
mov ax, 42
IF something == 1
xor bx, 10
ELSE
mov bx, 20
ENDIF
add ax, bx
コンパイルの前処理段階で、コンパイラはIF
andELSEIF
ステートメント (ドットなし) の条件をテストし、プログラムで最終的に使用されるコード ブロックの 1 つを選択します。上記のコードは次のようになります。
somewhere:
mov ax, 42
xor bx, 10
add ax, bx
もう一つの例:
something EQU 1
somewhere:
mov ax, 42
mov dx, something
.IF dx == 1
xor bx, 10
.ELSE
mov bx, 20
.ENDIF
add ax, bx
コンパイルの前処理段階で、コンパイラは.IF
ステートメント (ドット付き) をアセンブリ命令に変換します。上記のコードは、おそらく次のようになります。
something EQU 1
somewhere:
mov ax, 42
mov dx, 1
cmp dx, 1
jnz else_clause
xor bx, 10
jmp past_endif
else_clause:
mov bx, 20
past_endif:
add ax, bx
条件は実行時に実際にチェックされます。