条件判断ブロックを作成します。
構文 .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: