【深入浅出.Net IL】1.一个For循环引发的IL
2018-06-18 02:23:41来源:未知 阅读 ()
.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文件
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循环的代码的反编译代码就分析完了,请期待后续的文章。谢谢大家阅读本文章。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent 2020-06-05
- 分享一个自己项目中用到的c++版的日志类(对初学者十分有用的 2020-05-22
- C++ 单独编译 2020-05-10
- 图 2020-05-02
- STL之map 2020-04-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash