[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>分岐2(Branch)

分岐2(Branch)

前回の無条件分岐で分岐の雰囲気はつかめたと思います。今回は条件分岐をしてみましょう。

同じ時分岐(beq)

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)

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)

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)

ble

スタックに値を2つ積みます。その時、先に積んだ方の値が後に積んだ値以下の時に分岐を行います。

より小さい時分岐(blt)

blt

スタックに値を2つ積みます。その時、先に積んだ方の値が後に積んだ値より小さい時に分岐を行います。


ここにあげた命令にはそれぞれ「~.s」という形式があります。-128~127の範囲のジャンプに使えます。


ページの一番上へ
前のページへ一覧に戻る 次のページへ
初版2006-4-14
[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>分岐2(Branch)