MSIL的条件跳转(不知道正确与否)

C# Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void Main3_3_3()
{
int x = 10;

int y = 6;
if (x > y)
{
Console.WriteLine(x);
}
else
{
Console.WriteLine(y);
}

Console.Read();
}

对应MSIL及其注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.method  public  hidebysig  static  void  Main3_3_3() cil managed 
{
.maxstack 2
.locals init (
[0] int32 x,
[1] int32 y,
[2] bool CS$4$0000) //定义三个变量
L_0000: nop
L_0001: ldc.i4.s 10 //把整型值10载入堆栈
L_0003: stloc.0 //把刚才载入堆栈的10赋值给第一个local变量,也就是int x=10;
L_0004: ldc.i4.6 //把整型值6载入堆栈
L_0005: stloc.1 //把刚才载入堆栈的6赋值给第二个local变量,也就是int y=6;
L_0006: ldloc.0
L_0007: ldloc.1 //这两句,把x,y两个local变量载入堆栈
L_0008: cgt //比较x,y的大小,结果会保存在堆栈最上方(结果以0或1表示true ,false)
L_000a: ldc.i4.0 //把0载入堆栈
L_000b: ceq //比较0和cgt的运算结果是否相等,结果会保存在堆栈最上方(结果以0或1表示true ,false)
L_000d: stloc.2 //ceq的运算结果保存入bool变量中
L_000e: ldloc.2 //再把ceq运算结果载入
L_000f: brtrue.s L_001a //判断跳转,若跳转显式Y,不跳转显式X
L_0011: ldloc.0
L_0012: callvoid [mscorlib]System.Console::WriteLine(int32)
L_0017: nop
L_0018: br.s L_0021
L_001a: ldloc.1
L_001b: callvoid [mscorlib]System.Console::WriteLine(int32)
L_0020: nop
L_0021: call int32 [mscorlib]System.Console::Read()
L_0026: pop
L_0027: ret
}