为什么省略了ILASM反汇编中的某些线标签?

时间:2015-09-11 12:13:43

标签: c# il

我已经使用telerik JD反汇编了一些代码,我注意到一些标签被省略了,部分代码也没用了。

IL:

    .method assembly hidebysig instance void xxx (
        int32 p_intPer
    ) cil managed noinlining 
{
    IL_0000: br.s IL_000a

    IL_0002: call

    IL_0007: ldnull
    IL_0008: ldind.ref
    IL_0009: pop

    IL_000a: ldc.i4.0
    IL_000b: brtrue.s IL_0007
    .try
    {
        IL_000d: ldarg.0
        IL_000e: ldfld class [Reader]aaa bbb::getP 
        IL_0013: brfalse IL_0024

        IL_0018: ldarg.0
        IL_0019: ldfld class [Reader]aaa bbb::getP 
        IL_001e: ldarg.1
        IL_001f: callvirt instance void [Reader]aaa::Invoke(int32)

        IL_0024: leave IL_002f
    }
    catch [mscorlib]System.Object
    {
        IL_0029: pop
        IL_002a: leave IL_002f
    }

    IL_002f: ret
}

C#:

        internal void xxx(int per)
    {
        while (0 != 0) { }
        try
        {
            if (this.getP != null)
            {
                this.getP(per);
            }
        }
        catch { }
    }

我的意思是IL_0000 -> IL_0002 -> IL_0007

反编译器是愚蠢的,还是正常的? 另外,我在IL方面不是很熟练,但这对我来说并不像C#的实际来源

2 个答案:

答案 0 :(得分:2)

标签中的数字是以下指令的方法体中的偏移量。但并非每个指令和操作数都具有相同的大小。

  • IL_0000:br.s 1byte操作码1byte操作数
  • IL_0002:调用1byte操作码4byte操作数
  • IL_0007:ldnull 1byte opcode
  • IL_0008:ldind.ref 1byte opcode
  • [...]

答案 1 :(得分:1)

标签偶尔跳过几个数字是正常的,而不是每条指令都有相同的大小。