前回の無条件分岐で分岐の雰囲気はつかめたと思います。今回は条件分岐をしてみましょう。
beq
同じ時に分岐します。
.assembly extern mscorlib{} .assembly branchtest{} .method public static void main() cil managed { .entrypoint .maxstack 2 ldc.i4.0 ldc.i4.0 beq skip1 //下が実行されない ldc.i4 100 call void [mscorlib]System.Console:: WriteLine(int32) skip1: ldc.i4.0 ldc.i4.1 beq skip2 //下は実行される ldc.i4 999 call void [mscorlib]System.Console:: WriteLine(int32) skip2: ret }
分岐では上のようにスタックから2つの値を取り出して比較を行います。「beq」には派生系として「beq.s」があります。
bge
スタックに値を2つ積みます。その時、先に積んだ方の値が後に積んだ値以上の時に分岐を行います。
.assembly extern mscorlib{} .assembly branchtest{} .method public static void main() cil managed { .entrypoint .maxstack 2 ldc.i4 20 ldc.i4 1 bge skip1 //実行されない ldc.i4 100 call void [mscorlib]System.Console:: WriteLine(int32) skip1: ret }
bgt
スタックに値を2つ積みます。その時、先に積んだ方の値が後に積んだ値より大きい時に分岐を行います。
.assembly extern mscorlib{} .assembly branchtest{} .method public static void main() cil managed { .entrypoint .maxstack 2 ldc.i4 1 ldc.i4 1 bgt skip1 //bgeと違い、下が実行される ldc.i4 100 call void [mscorlib]System.Console:: WriteLine(int32) skip1: ret }
ble
スタックに値を2つ積みます。その時、先に積んだ方の値が後に積んだ値以下の時に分岐を行います。
blt
スタックに値を2つ積みます。その時、先に積んだ方の値が後に積んだ値より小さい時に分岐を行います。
ここにあげた命令にはそれぞれ「~.s」という形式があります。-128~127の範囲のジャンプに使えます。