专栏首页悟空聊架构 | 公众号【深入浅出.Net IL】1.一个For循环引发的IL

【深入浅出.Net IL】1.一个For循环引发的IL

1.准备工作

(1)新建一个project

using System;

namespace newArr
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] arrchars = new char[5];
            for (int i = 0; i < 5; i++)
            {
                arrchars[i] = 'a';
                Console.WriteLine(arrchars[i]);
            }
            Console.WriteLine("123");
        }
    }
}

(2)编译并生成exe文件

用IL Disassembler 工具打开exe文件

2.分析IL代码

打开Main方法

分析指令

1.初始化 local variable List

 .locals init ([0] char[] arrchars,

           [1] int32 i,

           [2] bool CS$4$0000)   

2.IL_0000:  nop

空操作

3.IL_0001:  ldc.i4.5

将整数5存放到Evaluation stack的顶部

4. IL_0002:  newarr     [mscorlib]System.Char

创建一个数组

5.  IL_0007:  stloc.0

将Evalution Stack 顶部值弹出放在第一个变量arrchars中

6.  IL_0008:  ldc.i4.0

将整数0压入到Evalution Stack

7.  IL_0009:  stloc.1

将Evalution Stack顶部的值0弹出存放到Local variable list的第2个变量i中

8.  IL_000a:  br.s       IL_0020

无条件跳转到地址:IL_0020

9.IL_0020:  ldloc.1

将Local variable list中的第2个变量的值copy一份到Evaluation stack的顶部

10.  IL_0021:  ldc.i4.5

将整数5存放到Evaluation Stack的顶部

11.IL_0022:  clt

比较Evaluation Stack顶部的两个值,如果0<5则将1存放到Evaluation Stack顶部,否则将0存放到Evaluation Stack顶部

12.  IL_0024:  stloc.2

将Evaluation Stack顶部的值1弹出存放到Local variable list的第二个变量中

13.  IL_0025:  ldloc.2

将Local variable list中的第二个变量的值copy一份到Evaluation stack的顶部

14.  IL_0026:  brtrue.s   IL_000c

判断Evaluation Stack顶部的值为true、非空或非零,则跳转到IL_000c否则顺序往下执行。因为顶部的值为1,所以跳转到地址IL_000c

15.  IL_000c:  nop

空操作

16.  IL_000d:  ldloc.0

将Local variable list中的第1个变量的值copy一份到Evaluation Stack的顶部

17.  IL_000e:  ldloc.1

将Local variable list中的第2个变量的值copy一份到Evaluation Stack的顶部

18.IL_000f:  ldc.i4.s   97

97对应的ACISS 码为'a',将'a'存放到Evaluation Stack的顶部

19.  IL_0011:  stelem.i2

将arrchars[0]赋值为'a',将arrchars[0]的值存放到Local variable list的变量arrchars中

20.  IL_0012:  ldloc.0

将Local variable list中的第1个变量的值copy一份到Evaluation Stack的顶部

21. IL_0013:  ldloc.1

将Local variable list中的第2个变量的值copy一份到Evaluation Stack的顶部

22.  IL_0014:  ldelem.u2

将arrchars[0]压入Evaluation Stack的顶部

23.  IL_0015:  call       void [mscorlib]System.Console::WriteLine(char)

调用System.Console.WriteLine(char)方法打印'a'

24.  IL_001a:  nop

空操作

25.  IL_001b:  nop

空操作

26.  IL_001c:  ldloc.1

将Local variable list中的第2个变量的值copy一份到Evaluation Stack的顶部

27.  IL_001d:  ldc.i4.1

将整数1压入Evaluation Stack的顶部

28. IL_001e:  add

将Evaluation Stack顶部的两个值相加,将结果1压入Evaluation Stack的顶部

29.  IL_001f:  stloc.1

将Evaluation Stack顶部的值1弹出存放到Local variable list的第二个变量中

30.重复执行下面的指令

  IL_0020:  ldloc.1

  IL_0021:  ldc.i4.5

  IL_0022:  clt

  IL_0024:  stloc.2

  IL_0025:  ldloc.2

  IL_0026:  brtrue.s   IL_000c

31.当Local variable list的第二个变量等于5时,

执行IL_0026:  brtrue.s   IL_000c 指令,顺序往下执行

32. IL_0028:  ldstr      "123"

将字符串"123"压入压入Evaluation Stack的顶部

33.  IL_002d:  call       void [mscorlib]System.Console::WriteLine(string)

调用Sys.Console.WriteLine(string)方法,打印"123"

34.  IL_0032:  nop

空操作

35.  IL_0033:  ret

返回

至此,这个for循环的代码的反编译代码就分析完了,请期待后续的文章。谢谢大家阅读本文章。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【.Net底层剖析】2.stfld指令-给对象的字段赋值

    悟空聊架构
  • 【专注力管理:让你的努力更高效】总结

    悟空聊架构
  • 【微信开发】02.搭建一个属于自己的微信公众平台 【网站开发】在新浪SAE上搭建一个博客

    悟空聊架构
  • [C#6] 3-null 条件运算符

    0. 目录 C#6 新增特性目录 1. 老版本的代码 1 namespace csharp6 2 { 3 internal class Perso...

    blackheart
  • [C#6] 4-string 插值

    0. 目录 C#6 新增特性目录 1. 老版本的代码 1 internal class Person 2 { 3 public string Na...

    blackheart
  • 《你必须知道的.NET》读书笔记:从Hello World认识IL

      IL是.NET框架中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但...

    Edison Zhou
  • 详解.net中IL语言

    中间语言,又称(IL语言)。充当Clr与.net 平台的中间语言,比如用C#编写程序,编译器首先是把C#代码转译成IL语言,最终由Clr解释执行,下面我们学习下...

    付威
  • MSIL学习------从HelloWorld开始

      前段时间突然想搞搞IL语言,于是在博客园中找到了包建强前辈关于IL的文章学习,并且在包前辈博客里看到了09年他与赵劼前辈关于是否有必要学习IL语言的争论,作...

    莫问今朝
  • [C#6] 5-自动属性增强

    0. 目录 C#6 新增特性目录 1. 老版本代码 1 internal class Person 2 { 3 public string Nam...

    blackheart
  • 【角色】——分离开代码和权限需求,即实现代码和权限需求的解耦。

    今天突然来了一个灵感,记录一下。以前总觉得说不清楚,看看这种表达方式是否可以说清。 两个原则:依赖接口编程,不要依赖实现编程;最小获知原则。 面向对象最重要的是...

    用户1174620

扫码关注云+社区

领取腾讯云代金券