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

分岐(switch)

C言語でおなじみの「switch」はILにもあります。

switch

ILのswitchは少し癖があります。それは「0からの連番へのジャンプテーブルである」というところです。とりあえず、ソースコードと、ヘクサエディタでの解析結果を見てください。

.assembly extern mscorlib{}
.assembly switch_test{}

.method public static void main() cil managed
{
    .entrypoint
    .maxstack 1
    ldc.i4.0
    switch(
        _main_Zero,
        _main_One,
        _main_Two)
    
    //どれにも当てはまらない場合は分岐しないのでここに来る。
    ldstr "むむむ?"
    br.s _main_fin
    
    _main_Zero:
    
    ldstr "零"
    br.s _main_fin
    
    _main_One:
    
    ldstr "弐"
    br.s _main_fin
    
    _main_Two:
    
    ldstr "に"
    br.s _main_fin
    
    //全てここに来る
    _main_fin:
    call    void [mscorlib]System.Console::WriteLine(string)
    
    ret
}

解析結果は以下のようになりました。

16 ldc.i4.0
45 switch
03 00 00 00 3個の分岐がある
07 00 00 00 「0」の時の分岐
0E 00 00 00 「1」の時の分岐
15 00 00 00 「2」の時の分岐
72 01 00 00 70 ldstr どれにも該当しなかったとき
2B 15 br.s
72 0B 00 00 70 ldstr 0の時
2B 0E br.s
72 0F 00 00 70 ldstr 1の時
2B 07 br.s
72 13 00 00 70 ldstr 2の時
2B 00 br.s
28 01 00 00 0A call 出力
2A ret

なかなかに素晴らしいものです。テーブルであることがよく分かります。しかも、int32型でのジャンプ範囲指定です。

特徴としては、前後どちらの方向にもジャンプできます。ですが、C#などほどの手軽さは無いですね。でも、動作は速そうな気がします。


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