.SWITCH / .CASE / .DEFAULT / .ENDSW 〔LASM〕

場合分けを表現します。.SWITCH ブロックを使用すると、あるオペランドを複数のオペランドと順に比較し、一致したオペランドに応じて異なる処理を行うことができます。C 言語や Java などの switch 文に相当します。

構文    .SWITCH    src
    .CASE    dst1
      statements...
      .BREAK
    .CASE    dst2
      statements...
      .BREAK
    .DEFAULT
      statements...
    .ENDSW

例    .SWITCH      AX
    .CASE        10
      MOV        DI, 100
      .BREAK
    .CASE        20
      MOV        DI, 200
      .BREAK
    .DEFAULT
      MOV        DI, 300
    .ENDSW

.SWITCH 文に比較元のオペランドを指定します。「AX」「CL」「BYTE PTR ES:[DI]」など、CMP 命令で使用できる任意のオペランドを指定できます。

次に、任意数の .CASE 文を記述します。各 .CASE 文には、比較先のオペランドを指定します。.SWITCH 文に指定した比較元オペランドと、.CASE 文に指定した比較先オペランドが一致すると、その .CASE 文に続く statements が実行されます。一致しなかった場合は、次の .CASE 文が試されます。

通常、各 .CASE 節(.CASE 文とそれに続く statements)の最後には、上の例のように.BREAK 文を記述します。.BREAK 文は制御を .ENDSW 文に移します。.BREAK 文を記述しないと、制御は直後の文に移ります。この場合、途中に別の .CASE 文があっても無視され、.CASE 条件は判定されません。これは C 言語の switch 文と同じ仕様です。

すべての .CASE 文を記述したら、最後に .DEFAULT 文を記述できます。すべての .CASE 文が成立しなかった場合、.DEFAULT 文があればその次の statements に制御が移され、.DEFAULT 文がなければ .ENDSW 文の直後に制御が移されます。

最後に .ENDSW 文を記述して、.SWITCH ブロックの終了を示します。

-------------------------------

.SWITCH ブロックは、場合分けを表現するための構文です。.SWITCH 文の比較元オペランドと一致する .CASE 文が見つかるまで、各 .CASE 文が上から順に検査されます。一致する .CASE 文が見つかると探索が終了し、その .CASE 文の次の文に制御が移されます。

2つ以上の .CASE 文に同じオペランドを指定するのは無意味です。2番目以降の .CASE 文が実行される可能性がないからです。また、.DEFAULT 文を2つ以上記述したり、.DEFAULT 文の後に .CASE 文を記述するのも無意味です。最初の .DEFAULT 文がすべての制御を受け取るからです。

.SWITCH ブロックのオペランド比較は CMP 命令で行われます。したがって、.SWITCH 文に指定する比較元オペランドと、.CASE 文に指定する比較先オペランドは、CMP 命令で比較可能な組み合わせでなければなりません。そうしないと、.ENDSW 文のアセンブル中にエラーが発生します。

.SWITCH ブロックは入れ子にすることができます。つまり、.CASE 節や .DEFAULT 節の中に別の .SWITCH ブロックを記述できます。また、.IF や .WHILE などのほかの構造化ディレクティブと相互に入れ子にすることもできます。

[目次]