条件判断ブロックを作成します。
構文 .IF cond1
statements1...
.ELSEIF cond2
statements2...
.ELSE
statements3...
.ENDIF
例 .IF AX > BX
MOV DL, 1
.ELSEIF AX == BX
MOV DL, 2
.ELSE
MOV DL, 3
.ENDIF
cond1 が真ならば、statements1 が実行されます。cond1 が偽で cond2 が真ならば、statements2 が実行されます。cond1 と cond2 が両方とも偽ならば、statements3 が実行されます。
.ELSEIF 文と statements2 の組は、任意の数だけ記述できます。
.ELSE 文と statements3 の組は、0 または 1 個だけ記述できます。
statements? には、任意のプロセッサ命令をいくつでも記述できます。
それぞれの cond? は、次の構文で記述します。
構文1 operand1 operator operand2 構文2 flag
operand? には、cmp 命令や and 命令のオペランドに指定できるアセンブラ式を記述します。たとえば、「AX」や「BYTE PTR [DI]」などを指定できます。実際には cmp 命令などが生成されるため、この命令で処理できないオペランドの組み合せは指定できません。たとえば、両方ともメモリオペランドを指定すると、エラーになります。
演算子
operator には、次のいずれかを指定します。
operator operand2 を省略すると、「!= 0」と記述したものと見なされます。
「>」「>=」「<」「<=」を使用する場合は、オペランドが符号付きかどうかで実際に生成されるコードが変わるので注意してください。デフォルトは符号なしです。
例 .IF AX == 10 ; AX が 10 ならば
.IF SWORD PTR AX >= 10 ; AX が 10 以上ならば(符号付きの比較)
.IF WORD PTR [BX] > 0 ; [BX] が正ならば
.IF SWORD PTR [BX] > 0 ; [BX] が正ならば(符号付きの比較)
.IF AL ; AL が0でなければ
.IF DX & [SI+BX] ; ビットアンド値が0でなければ
フラグ
条件をフラグ名で指定することもできます。flag には、次のいずれかを指定します。
例 .IF CARRY? ; キャリーフラグが1ならば
.IF ZERO? ; ゼロフラグが1ならば
論理結合
さらに、条件式を論理結合することができます。
結合の優先順位は、結合力の強い方から「!」「&&」「||」の順です。
例 .IF ! AL ; AL が0ならば
.IF ! ( AX == 10 ) ; AX != 10 と同等
.IF ( AL < 'a' ) || ( AL > 'z' ) ; AL が小文字でなければ
.IF CARRY? || SIGN? ; CF か SF が1ならば
実例
実際にどのようなアセンブラコードが作成されるのか、例を示します。
.IF ( AX > 10 )
MOV CL, 1
.ELSEIF ( AX != 5 ) && ( AX != 6 )
MOV CL, 2
.ELSE
MOV CL, 3
.ENDIF
これは次のコードに変換されます。
CMP AX, 10
JBE ?0s
MOV CL, 1
JMP ?2s
?0s:
CMP AX, 5
JE ?1s
CMP AX, 6
JE ?1s
MOV CL, 2
JMP ?2s
?1s:
MOV CL, 3
?2s: