2015-03-19 5 views
1

У меня вопрос о CIL. Что такое команда beq (Филиал, если таковая имеется) в CIL?Ветвление в CIL

Я читал об этом здесь: List of CIL instructions

+0

Вы говорите, что вы полностью понимаете все остальные инструкции * кроме * 'beq'? Если да, то что с ним вы считаете непонятным/не согласным с другими инструкциями? Или мы должны ожидать поток вопросов, каждый из которых касается одной инструкции? –

+0

Остальное кажется довольно ясным, но я не понимаю концепции ветвления. – BendEg

+0

Если (a == b) goto –

ответ

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 
} 
Смежные вопросы