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

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

阅读目录

.Net底层剖析目录章节

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

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

3.【.Net底层剖析】3.用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文件

图片.png

 

 

2.分析IL代码

打开Main方法

图片.png

分析指令

1.初始化 local variable List

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

          [1] int32 i,

          [2] bool CS$4$0000)   

图片.png

2.IL_0000:  nop

空操作

3.IL_0001:  ldc.i4.5

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

图片.png

 

4. IL_0002:  newarr     [mscorlib]System.Char

创建一个数组

图片.png

5.  IL_0007:  stloc.0

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

图片.png

 

6.  IL_0008:  ldc.i4.0

将整数0压入到Evalution Stack

图片.png

7.  IL_0009:  stloc.1

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

图片.png

 

8.  IL_000a:  br.s       IL_0020

无条件跳转到地址:IL_0020

9.IL_0020:  ldloc.1

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

图片.png

 

10.  IL_0021:  ldc.i4.5

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

图片.png

 

 

11.IL_0022:  clt

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

图片.png

12.  IL_0024:  stloc.2

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

图片.png

13.  IL_0025:  ldloc.2

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

图片.png

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的顶部

图片.png

17.  IL_000e:  ldloc.1

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

图片.png

 

18.IL_000f:  ldc.i4.s   97

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

图片.png

19.  IL_0011:  stelem.i2

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

图片.png

20.  IL_0012:  ldloc.0

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

图片.png

21. IL_0013:  ldloc.1

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

图片.png

22.  IL_0014:  ldelem.u2

arrchars[0]压入Evaluation Stack的顶部

图片.png

 

 

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的顶部

图片.png

27.  IL_001d:  ldc.i4.1

将整数1压入Evaluation Stack的顶部

图片.png

28. IL_001e:  add

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

图片.png

29.  IL_001f:  stloc.1

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

图片.png

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循环的代码的反编译代码就分析完了,请期待后续的文章。谢谢大家阅读本文章。




相关文章
|
NoSQL API 调度
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
184 0
|
机器学习/深度学习 人工智能 算法
R2AU-Net: 基于循环残差注意力和半监督学习范式的道路裂缝分割算法
R2AU-Net: 基于循环残差注意力和半监督学习范式的道路裂缝分割算法
220 0
|
前端开发 程序员 C#
【C#】.net core2.1,在实体类写了个非常经典的无限循环错误
遇到一个非常有趣的bug,使用VS2017调试运行.net core2.1 MVC项目时,程序本身运行的好好的,突然启动起来就报错 不得不说,编码细节很重要
141 0
|
.NET C# C++
详解.NET IL代码(一)
  本文主要介绍IL代码,内容大部分来自网上,进行整理合并的。 一、IL简介  为什么要了解IL代码?   如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以通过IL代码透过表面看本质;IL也是更好理解、认识CLR的基础;大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;  什么是IL?   IL是.NET框架中中间语言(Intermediate Language)的缩写。
2270 0
|
存储 开发框架 自然语言处理
【.Net底层剖析】3.用IL来理解属性
【.Net底层剖析】3.用IL来理解属性
161 0
【.Net底层剖析】3.用IL来理解属性
|
Windows
一起谈.NET技术,如何通过ildasm/ilasm修改assembly的IL代码
  这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是“Could you file a bug report for this issue through Connect?”,绝望之后的又一次寒心啊。
1006 0
|
.NET
一起谈.NET技术,关于Expression Tree和IL Emit的所谓的&quot;性能差别&quot;
  昨天写了《三种属性操作性能比较》,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思。反正今天呆在家里也没事儿,干脆再就这个话题再写一篇文章。
876 0
|
人工智能 JavaScript 测试技术
一起谈.NET技术,三种For循环写法的性能比较
  循环作为程序语言的三大逻辑控制结构之一,在实际开发是经常会遇到的。在JavaScript程序的循环结构使用上,我们经常会遇到这种应用。根据一个对象的长度进行循环并对对象每个每个元素进行处理。   如 for(var i=0;ifor(var i=0,iLen=a.length;ifor(var i=0,item;(item=a[i])!=undefined;i++){ sum+=item;} 对于三种写法其性能到底有多大差异呢?到底哪个的效率更高呢?我在自己的机器上对其做了测试:发现在10000条数据以下时三者执行速度差别不大,差别大概在0.01m左右,而且测试结果不稳定。
1009 0
|
Windows
如何通过ildas“.NET技术”m/ilasm修改assembly的IL代码
  这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是“Could you file a bug report for this issue through Connect?”,绝望之后的又一次寒心啊。
1022 0
|
Windows
如何通过ildasm/ilasm修改assem“.NET研究”bly的IL代码
  这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是“Could you file a bug report for this issue through Connect?”,绝望之后的又一次寒心啊。
1185 0