.IF / .ELSEIF / .ELSE / .ENDIF

条件判断ブロックを作成します。

構文    .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 が実行されます。cond1cond2 が両方とも偽ならば、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:

[目次]