前回の無条件分岐で分岐の雰囲気はつかめたと思います。今回は条件分岐をしてみましょう。
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の範囲のジャンプに使えます。