2015-03-19 62 views
1

我有一个关于CIL的问题。在CIL中,beq(Branch to target if equal)命令是什么?在CIL中分支

我读过有关它在这里:List of CIL instructions

+0

你是说你完全了解所有其他指令*除了*'beq'?如果是这样,那么你觉得混乱/不符合其他说明呢?或者,我们是否期待着大量的问题,每一个问题都涉及单个指令? – 2015-03-19 07:49:13

+0

其余的似乎很清楚,但我不明白分支的概念。 – BendEg 2015-03-19 07:53:37

+0

如果(a == b)转到 – 2015-03-19 07:59:45

回答

1

beq target指令传输控制(“跳跃”)的目标,如果堆顶两个值相等。这与ceq指令后跟brtrue target相同。鉴于方法:

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

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

.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 
}