.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[];
for (int i = ; i < ; i++)
{
arrchars[i] = 'a';
Console.WriteLine(arrchars[i]);
}
Console.WriteLine("");
}
}
}

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

【深入浅出.Net IL】1.一个For循环引发的IL的更多相关文章

  1. 记录一个i变量引发的事故

    概述 近期开发中遇到一个特别的问题,觉得很有必要与你下来.就是由于在开发中一个很小的疏忽,导致了很大的问题,是什么呢? 现象 我的程序突然引发了v8内部的错误,提示都是c++的,如下.程序一启动就直接 ...

  2. SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。

    一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...

  3. 【Shell脚本】怎样表示一个for循环

    [Shell脚本]怎样表示一个for循环 在此说一下我常用的两个结构: 1. for i in $(seq 1 100); do         echo $i done 2. for (( i = ...

  4. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...

  5. 使用一个for循环将N*N的二维数组的所有值置1

    <?php // 使用一个for循环将N*N的二维数组的所有值置1 $n = ; $a = []; ;$i<$n*$n;$i++){ $a[$i/$n][$i%$n] = ; } prin ...

  6. Mysql中where条件一个单引号引发的性能损耗

    日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...

  7. 面试题-一个for循环输出一个棱形

    用一个for循环输出以下棱形 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ...

  8. 写一个方法,用一个for循环打印九九乘法表

    public class MultiplicationTable { /**  * @description 写一个方法,用一个for循环打印九九乘法表   * @author  wangkun  * ...

  9. 如何用一个for循环打印出一个二维数组

    思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...

随机推荐

  1. iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示

    iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端.  打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面.   ...

  2. android: 服务的生命周期

    9.4   服务的生命周期 之前章节我们学习过了活动以及碎片的生命周期.类似地,服务也有自己的生命周期, 前面我们使用到的 onCreate().onStartCommand().onBind()和 ...

  3. 跑PIN码破解无线网络WIFI密码的原理分析(转)

    你们家用的无线路由器安全吗?有人蹭网吗?无线路由器的漏洞在哪里?这么避免蹭网? 想要了解这些,必须要了解加密以及破解原理. 工具/原料 电脑 足够多足够好的wifi信号源 usb无线网卡(非必需) 一 ...

  4. 努力学习 HTML5 (2)—— 元素的增和删

    HTML5 放松了某些规则,HTML5 的制定者想让这门语言更紧密地反映浏览器的现实. 放松的规则 不要求包含 <html>.<head> 和 <body> 元素. ...

  5. Open vSwitch实践——VLAN

    # virt-clone --original=centos65 --name=vm2 --file=vm2.qcow2 正在克隆 centos65.qcow2                     ...

  6. 闲聊Redshift与日本CG行业的近况

    最近不少朋友跟我说Redshift如何如何,恰巧我目前工作的工作室花费了巨资购买了Redshift和Quadro M4000,妄图在艺术家工作站上做一个新的动画项目,把渲染时间控制在15分钟以下.结果 ...

  7. maven eclipse miss required library解决

    我是直接到C:\Users\admin\.m2\repository目录把所有的库包全删除,然后在项目里刷新一下,搞定!

  8. javamail邮件发送例子

    public class EmailTask{        // Session used by the javamail classes    private Session session;   ...

  9. LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间

     LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间    把LOB字段的SEGMENT 存放在指定表空间.清理CLOB字段及压缩CLOB空间 1.创建LOB字段存放表空间:create ...

  10. Openvswitch原理与代码分析(1):总体架构

      一.Opevswitch总体架构   Openvswitch的架构网上有如下的图表示:       每个模块都有不同的功能 ovs-vswitchd 为主要模块,实现交换机的守护进程daemon ...