【深入浅出.Net IL】1.一个For循环引发的IL
2.【.Net底层剖析】2.stfld指令-给对象的字段赋值
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的更多相关文章
- 记录一个i变量引发的事故
概述 近期开发中遇到一个特别的问题,觉得很有必要与你下来.就是由于在开发中一个很小的疏忽,导致了很大的问题,是什么呢? 现象 我的程序突然引发了v8内部的错误,提示都是c++的,如下.程序一启动就直接 ...
- SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。
一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...
- 【Shell脚本】怎样表示一个for循环
[Shell脚本]怎样表示一个for循环 在此说一下我常用的两个结构: 1. for i in $(seq 1 100); do echo $i done 2. for (( i = ...
- 一个purge参数引发的惨案——从线上hbase数据被删事故说起
在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”. ...
- 使用一个for循环将N*N的二维数组的所有值置1
<?php // 使用一个for循环将N*N的二维数组的所有值置1 $n = ; $a = []; ;$i<$n*$n;$i++){ $a[$i/$n][$i%$n] = ; } prin ...
- Mysql中where条件一个单引号引发的性能损耗
日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...
- 面试题-一个for循环输出一个棱形
用一个for循环输出以下棱形 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ...
- 写一个方法,用一个for循环打印九九乘法表
public class MultiplicationTable { /** * @description 写一个方法,用一个for循环打印九九乘法表 * @author wangkun * ...
- 如何用一个for循环打印出一个二维数组
思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...
随机推荐
- Python模拟用户登录
# coding=utf8 import hashlib db = { 'michael':'e10adc3949ba59abbe56e057f20f883e', 'bob':'878ef96e861 ...
- eclipse code templates 设置(eclipse注释模版配置)
文件(Files)注释标签:/** * @Title: ${file_name} * @Package ${package_name} * @Description: ${todo} * Copyri ...
- SVN命令模式批量更新多个项目文件
使用svn作为版本管理是,在一个仓库下边同时建立多个项目,每天上班都需要一个个更新,为了发挥程序员懒的精神,能让电脑做的,绝不手工操作.作为自动化处理,在windows环境,首先想到了bat Tort ...
- Android——BitMap(位图)相关知识总结贴
Android中文API(136) —— Bitmap http://www.apkbus.com/android-54644-1-1.html Android 4.0 r1 API—Bitmap(S ...
- c#复制包含子目录文件夹代码
c#没有复制目录的代码,需要通过递归实现复制目录: 需要引用System.IO命名空间,实现代码如下: private static bool CopyDirectory(string SourceP ...
- VB中WinSock控件的属性、方法、事件及应用
一.WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...
- SimpleTemplate模板引擎开发
模板引擎相信大家是经常使用的,但是实现原理估计没多少人知道(你要是说不就是replace嘛,那我也无话说了...). 先来看看这个SimpleTemplate想实现的是什么功能吧: 是个C#端的模板引 ...
- JAVA生产者消费者的实现
春节回了趟老家,又体验了一次流水席,由于桌席多,导致上菜慢,于是在等待间,总结了一下出菜流程的几个特点: 1.有多个灶台,多个灶台都在同时做菜出来. 2.做出来的菜,会有专人用一个托盘端出来,每次端出 ...
- 十进制转二进制and位运算符
先给大家送个福利! ---------------简单口算-------------------------- 10 >> 1010 除2取余倒写 /* 十进制转二进制规则是:除二取 ...
- Swift中的Void类型与空元祖表达式
可能有不少Swift开发者会忽略这么一个细节:在Swift中,Void类型其实是一个别名类型,而其真正的类型为(),即一个空元祖(empty tuple)! 这种语言特性给Swift带来了一些比较方便 ...