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

 
C# Code:
  1. public static void Main3_3_3()
  2. {
  3.     int x = 10;
  4.     int y = 6;
  5.     if (x > y)
  6.     {
  7.         Console.WriteLine(x);
  8.     }
  9.     else
  10.     {
  11.         Console.WriteLine(y);
  12.     }
  13.     Console.Read();
  14. }

对应MSIL及其注释:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值