分支在CIL

时间:2015-03-19 07:39:49

标签: .net cil

我对CIL有疑问。 CIL中的beq(如果相等则为目标分支)命令是什么?

我在这里读过:List of CIL instructions

1 个答案:

答案 0 :(得分:2)

如果堆栈上的前两个值相等,beq target指令将控制("跳转")转移到目标。这与ceq指令后跟brtrue target相同。给定方法:

static int BranchTest(int value1, int value2)
{
    if (value1 == value2)
    {
        return SomeMethod(0);
    }
    else
    {
        return SomeMethod(1);    
    }
}

它可以(但这只是一个示例代码)翻译成:

.method private hidebysig static 
    int32 BranchTest (
        int32 value1,
        int32 value2
    ) cil managed 
{
    // ...

    IL_0000: ldarg.0      // load value1 on stack
    IL_0001: ldarg.1      // load value2 on stack
    IL_0002: beq IL_000b  // compare and jump conditionaly

    IL_0004: ldc.i4.1
    IL_0005: call int32 ConsoleLeak.Program::SomeMethod(int32)
    IL_000a: ret

    IL_000b: ldc.i4.0
    IL_000c: call int32 ConsoleLeak.Program::SomeMethod(int32)
    IL_0011: ret
}