码迷,mamicode.com
首页 > 其他好文 > 详细

如何看懂IL代码--转载

时间:2015-04-19 11:25:20      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

1技术分享//示例一:输出整数的立方值。
  2技术分享private void PrintCube( int i )
  3技术分享{
  4技术分享    int cube = i * i * i;
  5技术分享    Console.WriteLine( cube );
  6技术分享}
  7技术分享//方法签名。
  8技术分享/// hidebysig:MethodAttributes 枚举值之一,指示此方法按名称和签名隐藏,否则只
  9技术分享/// 按名称隐藏。
 10技术分享/// cil managed:未查到具体资料,应是“受中间语言管理”之意。
 11技术分享
 12技术分享.method private hidebysig instance void 
 13技术分享          PrintCube(int32 i) cil managed
 14技术分享  {
 15技术分享    // 代码大小       15 (0xf)
 16技术分享    .maxstack  2
 17技术分享    /**//// 在 .locals 部分声明所有的局部变量。
 18技术分享    .locals init ([0] int32 cube)    /**//// 第一个名局部变量,int 型,名为 cube。索
 19技术分享                                    /// 引从 0 开始。
 20技术分享    IL_0000:  nop    /**//// no operation.
 21技术分享    IL_0001:  ldarg.1    /**//// load argument 第一个方法参数入栈,比如“3”。索引号
 22技术分享                        /// 从 1 开始,而不是从 0 开始。
 23技术分享    IL_0002:  ldarg.1    /**//// 再次向堆栈压入第一个方法参数,又一个“3”。
 24技术分享    IL_0003:  mul    /**//// multiply 计算堆栈最顶上两个数的乘积 3×3,并把结果入栈,
 25技术分享                    /// 即堆栈最顶部是 9 了。
 26技术分享    IL_0004:  ldarg.1    /**//// 再次压入第一个方法参数“3”。
 27技术分享    IL_0005:  mul    /**//// 堆栈最顶上是“3”,第二是“9”,计算 3×9,此时 27 入栈。
 28技术分享    IL_0006:  stloc.0    /**//// pop value from stack to local variable 堆栈最顶上的
 29技术分享                        /// 值“27”出栈,并被赋给索引位置“0”处的局部变量 cube,
 30技术分享                        /// 即内存中变量 cube 的值为“27”。
 31技术分享    IL_0007:  ldloc.0    /**//// 局部变量 cube 的值“27”入栈。
 32技术分享    IL_0008:  call       void [mscorlib]System.Console::WriteLine(int32)
 33技术分享                        /**//// 控制台输出堆栈最顶上的 32 位整数“27”。
 34技术分享    IL_000d:  nop    /**//// no operation. 35    IL_000e:  ret    /**//// return from method. 36  } // end of method Program::PrintCube 37//示例二:把字符串拆分成字符,并按顺序每行输出一个字符 38public void SeparateString( string source ) 39{ 40    if( source == null ) 41        return; 42 43    int count = source.Length; 44 45    char c; 46    for( int i = 0; i < count; i++ ) 47    { 48        c = source[ i ]; 49        Console.WriteLine( c ); 50    } 51} 52 53.method public hidebysig instance void  54          SeparateString(string source) cil managed 55  { 56    // 代码大小       55 (0x37) 57    .maxstack  2 58    .locals init ([0] int32 count, 59             [1] char c, 60             [2] int32 i, 61             [3] bool CS$4$0000)    /**//// 索引为“3”的这个布尔型局部变量在 C# 代 62                                    /// 码中并未显式声明,是编译器编译时添加的, 63                                    /// 用于保存执行过程中布尔运算的结果,比如比 64                                    /// 较 source 是否为空时,以及比较 i<count 时。 65    IL_0000:  nop 66    IL_0001:  ldarg.1    /**//// 方法参数 source 的值入栈。 67    IL_0002:  ldnull    /**//// “空引用”null入栈。 68    IL_0003:  ceq    /**//// compare equal 比较栈顶的 null 和第二项的 source 是否相等,并 69                    /// 把结果 0(false,source 不为空)或 1(true,source 为空)入栈。 70    IL_0005:  ldc.i4.0    /**//// 32 位整型数“0”入栈。 71    IL_0006:  ceq    /**//// 比较栈顶的“0”和堆栈的第二项,第二项可能是“0”,也可能 72                    /// 是“1”。比较的结果“1”或“0”入栈。 73    IL_0008:  stloc.3    /**//// 栈顶的“1”或“0”出栈,被保存到索引为“3”的局部变量中。 74    IL_0009:  ldloc.3    /**//// 执行后,栈顶为“1”(source 不为空)或“0”(source 为空)。 75    IL_000a:  brtrue.s   IL_000e    /**//// branch on non-false or non-null 判断栈顶是否 76                                    /// 为“1”,如果是,跳转到第“IL_000e”行;否则 77                                    /// 继续往下执行。 78 79    IL_000c:  br.s       IL_0036    /**//// unconditional branch 当栈顶为“0”时,才会 80                                    /// 执行到这一行,这一行的执行结果是程序无条件 81                                    /// 跳转到第“IL_0036”行。 82 83    IL_000e:  ldarg.1 84    IL_000f:  callvirt   instance int32 [mscorlib]System.String::get_Length()     85                        /**//// 对堆栈最顶上的字符串调用其获取长度的实例方法,长度值被入栈。 86                        /// “get_Length()”实际是字符串 Length 属性的“get”部分。 87    IL_0014:  stloc.0    /**//// 局部变量 count 被赋值为字符串长度。 88    IL_0015:  ldc.i4.0 89    IL_0016:  stloc.2    /**//// 局部变量 i 被赋值为 0。 90    IL_0017:  br.s       IL_002e    /**//// 无条件跳转到第“IL_002e”行。 91 92    IL_0019:  nop 93    IL_001a:  ldarg.1 94    IL_001b:  ldloc.2 95    IL_001c:  callvirt   instance char [mscorlib]System.String::get_Chars(int32)     96                        /**//// source 中索引为 i 处的 char 值入栈。 97    IL_0021:  stloc.1 98    IL_0022:  ldloc.1 99    IL_0023:  call       void [mscorlib]System.Console::WriteLine(char)    /**//// char 值被输100                                                                        /// 出到控制台。101    IL_0028:  nop102    IL_0029:  nop103    IL_002a:  ldloc.2    /**//// i 值入栈。104    IL_002b:  ldc.i4.1    /**//// 32 位整数 1 入栈。105    IL_002c:  add    /**//// i+1 的结果入栈。106    IL_002d:  stloc.2    /**//// i=i+1。107    IL_002e:  ldloc.2    /**//// i 值入栈。108    IL_002f:  ldloc.0    /**//// count 值入栈。109    IL_0030:  clt    /**//// compare less than 比较 i<count 是否为真,比较结果入栈。110    IL_0032:  stloc.3111    IL_0033:  ldloc.3112    IL_0034:  brtrue.s   IL_0019    /**//// 如果 i<count 则跳转到第“IL_0019”行。113114    IL_0036:  ret115  } // end of method Program::SeparateString116117

如何看懂IL代码--转载

标签:

原文地址:http://www.cnblogs.com/haust/p/4438724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!