CIL 中的分支
Branching in CIL
我有一个关于 CIL 的问题。 CIL 中的 beq
(如果相等则分支到目标)命令是什么?
我在这里读到过:List of CIL instructions
如果堆栈顶部的两个值相等,beq target
指令将控制权 ("jumps") 转移到目标。这与 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
}
我有一个关于 CIL 的问题。 CIL 中的 beq
(如果相等则分支到目标)命令是什么?
我在这里读到过:List of CIL instructions
如果堆栈顶部的两个值相等,beq target
指令将控制权 ("jumps") 转移到目标。这与 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
}