4

IL にコンパイルされると、ifステートメントはどのように見えますか?

これは、C# の非常に単純な構造です。誰かがそれが実際に何であるかのより抽象的な定義を私に与えることができますか?

4

4 に答える 4

11

ここにいくつかのifステートメントとそれらがILにどのように変換されるかを示します。

ldc.i4.s 0x2f                      var i = 47;
stloc.0 

ldloc.0                            if (i == 47)
ldc.i4.s 0x2f
bne.un.s L_0012

ldstr "forty-seven!"                   Console.WriteLine("forty-seven!");
call Console::WriteLine

L_0012:
ldloc.0                            if (i > 0)
ldc.i4.0 
ble.s L_0020

ldstr "greater than zero!"             Console.WriteLine("greater than zero!");
call Console::WriteLine

L_0020:
ldloc.0                            bool b = (i != 0);
ldc.i4.0 
ceq 
ldc.i4.0 
ceq 
stloc.1 

ldloc.1                            if (b)
brfalse.s L_0035

ldstr "boolean true!"                  Console.WriteLine("boolean true!");
call Console::WriteLine

L_0035:
ret

ここで注意すべきことの1つは、IL命令は常に「反対」です。これは、「もしそうなら、ブロックの本体を飛び越えるif (i > 0)」という意味の効果的な意味になります。i <= 0if

于 2010-09-07T23:33:20.920 に答える
5

スタックの最上位の値に応じてターゲット命令にジャンプする分岐命令が使用されます。

brfalse Branch to target if value is zero (false)
brtrue  Branch to target if value is non-zero (true)
beq     Branch to target if equal
bge     Branch to target if greater than or equal to
bgt     Branch to target if greater than
ble     Branch to target if less than or equal to
blt     Branch to target if less than
bne.un  Branch to target if unequal or unordered
于 2010-09-07T23:40:17.673 に答える
4

の状態によりifます。たとえばnull、コンパイラに対する参照をチェックしている場合、brfalse命令が発行されます (または、brtrue記述内容に応じて)。

実際の 状態ifは状態自体に基づいて異なりますが、逆アセンブラILDASMや Reflector のようなものが、より多くのことを学習するためのより良いツールになります。

于 2010-09-07T23:24:10.633 に答える
2

簡単な例:

ldloc.1                    // loads first local variable to stack
ldc.i4.0                   // loads constant 0 to stack
beq                        // branch if equal

これは次のようになります。

if(i == 0) //if i is the first local variable

条件分岐を含め、他の if は異なります。これは 1 回の投稿で説明するには多すぎます。IL-Code の紹介を探したほうがよいでしょう。

これに関するcodeprojectに関する素晴らしい記事があります。

于 2010-09-07T23:29:36.403 に答える