IL 学习笔记
先上几篇博客链接:
IL指令速记表
通过下面的速记表我们可以很容易的记忆CIL的指令:比如我们知道一个ldloc.0=ld(load)+loc(local)+.0(0位置的参数)=将索引 0 处的局部变量加载到计算堆栈上。
| 主要操作 | 操作数范围/条件 | 操作数类型 | 操作数 | |||||||||
| 缩写 | 全称 | 含义 | 缩写 | 全称 | 含义 | 缩写 | 全称 | 含义 | 缩写 | 全称 | 含义 | |
| ld | load | 将操作数压到堆栈当中,相当于: push ax |
arg | argument | 参数 | ? | ? | 操作数中的数值 | .0 | ? | 第零个参数 * | |
| .1 | ? | 第一个参数 | ||||||||||
| .2 | ? | 第二个参数 | ||||||||||
| .3 | ? | 第三个参数 | ||||||||||
| .s xx | (short) | 参数xx | ||||||||||
| a | address | 操作数的地址 | 只有 .s xx,参见ldarg.s | |||||||||
| loc | local | 局部变量 | 参见ldarg | |||||||||
| fld | field | 字段(类的全局变量) | 参见ldarg | xx | ? | xx字段,eg: ldfld xx |
||||||
| c | const | 常量 | .i4 | int 4 bytes | C#里面的int,其他的类型例如short需要通过conv转换 | .m1 | minus 1 | -1 | ||||
| .0 | ? | 0 | ||||||||||
| .1 | ? | 1 | ||||||||||
| …… | ||||||||||||
| .8 | 8 | |||||||||||
| .s | (short) | 后面跟一个字节以内的整型数值(有符号的) | ||||||||||
| ? | ? | 后面跟四个字节的整型数值 | ||||||||||
| .i8 | int 8 bytes | C#里面的long | ? | ? | 后面跟八个字节的整型数值 | |||||||
| .r4 | real 4 bytes | C#里面的float | ? | ? | 后面跟四个字节的浮点数值 | |||||||
| .r8 | real 8 bytes | C#里面的double | ? | ? | 后面跟八个字节的浮点数值 | |||||||
| null | null | 空值(也就是0) | ? | ? | ? | ? | ? | ? | ||||
| st | store | 将堆栈内容弹出到操作数中,相当于: pop ax |
参见ld ** | |||||||||
| conv | convert | 数值类型转换,仅仅用纯粹的数值类型间的转换,例如int/float等 | ? | ? | ? | .i1 | int 1 bytes | C#里面的sbyte | ? | ? | ? | |
| .i2 | int 2 bytes | C#里面的short | ||||||||||
| .i4 | int 4 bytes | C#里面的int | ||||||||||
| .i8 | int 8 bytes | C#里面的long | ||||||||||
| .r4 | real 4 bytes | C#里面的float | ||||||||||
| .r8 | real 8 bytes | C#里面的double | ||||||||||
| .u4 | uint 4 bytes | C#里面的uint | ||||||||||
| .u8 | uint 8 bytes | C#里面的ulong | ||||||||||
| b/br | branch | 条件和无条件跳转,相当于: jmp/jxx label_jump |
br | ? | ? | 无条件跳转 | ? | ? | ? | ? | ? | 后面跟四个字节的偏移量(有符号) |
| .s | (short) | 后面跟一个字节的偏移量(有符号) | ||||||||||
| false | false | 值为零的时候跳转 | ? | ? | ? | 参见br | ||||||
| true | true | 值不为零的时候跳转 | ? | ? | ? | |||||||
| b | eq | equal to | 相等 | ? | ? | ? | ||||||
| ne | not equal to | 不相等 | un | unsigned or unordered | 无氟好的(对于整数)或者无序的(对于浮点) | |||||||
| gt | greater than | 大于 | ||||||||||
| lt | less than | 小于 | ||||||||||
| ge | greater than or equal to | 大于等于 | ||||||||||
| le | less than or equal to | 小于等于 | ||||||||||
| call | call | 调用 | ? | ? | ? | ? | ? | (非虚函数) | ? | |||
| ? | ? | ? | virt | virtual | 虚函数 | |||||||
1.托管代码与非托管代码
托管代码,说白了就是委托CLR管理的代码,内存由CLR帮忙管理,自动GC,而非托管,就是直接与操作系统底层交互,自己控制内存
“托管程序”是需要通过访问公共语言运行时(cls)才能访问操作系统的程序
“非托管程序”不用通过访问公共语言运行时(cls)可以直接访问操作系统的程序
像C#、VB之类的,就是托管代码,他们要先编译成IL语言,然后再由CLR的JIT编译器编译成机器语言与操作系统交互,由CLR控制
而C++,则是可以直接操作管理内存,当然,C++可以选择编译成托管类型的代码

2. IL中的三个存储概念
IL的虚拟机是一个堆栈式结构的机制

图片来源:https://msdn.microsoft.com/zh-tw/library/dd229210.aspx
- Managed Heap(托管堆):这就是NET中的托管堆,用来存放引用类型,它是由GC(垃圾回收器自动进行回收)管理;比如声明字符串str = "123",就是将"123"保存在托管堆,然后要用的时候再将"123"的地址给计算栈
- Call Stack(调用堆栈):调用堆栈是一个方法列表,按调用顺序保存所有在运行期被调用的方法。
- Evaluation Stack(计算堆栈):每个线程都有自己的线程栈,IL 里面的任何计算,都发生在计算栈上。可以 Push,也可以 Pop。比如计算1 + "str",就是先将数字1入栈,然后再将1封箱为"1"替换,再将"str"的引用地址入栈,然后调用合并函数将栈顶前两个字符串连接起来,再将结果的引用放在栈顶。
IL 学习笔记的更多相关文章
- .NET IL学习笔记(一)
参考资料: 1. <.NET IL Assembler> 2. NGEN代码产生器 3. NGEN的使用 4. IL编辑器下载 5. IL编辑器的使用 知识点: ● Common Lang ...
- [读书笔记]C#学习笔记一: .Net Framwork
前言: 一次偶然的机会 在园子里看到@Learning hard 出版的一本书: <<C#学习笔记>>, 然后买来 一直到现在读完, 感觉很不错, 适合入门, 书中内容是从C ...
- Extjs 学习笔记1
学习笔记 目 录 1 ExtJs 4 1.1 常见错误处理 4 1.1.1 多个js文件中有相同的控件,切换时无法正常显示 4 1.1.2 Store的使用方法 4 1.1.3 gridPanel ...
- Android学习笔记(十二)——实战:制作一个聊天界面
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...
- [读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- C#学习笔记二: C#类型详解
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
- SQL学习笔记
SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...
- VSTO学习笔记(一)VSTO概述
原文:VSTO学习笔记(一)VSTO概述 接触VSTO纯属偶然,前段时间因为忙于一个项目,在客户端Excel中制作一个插件,从远程服务器端(SharePoint Excel Services)上下载E ...
随机推荐
- BZOJ3029守卫者的挑战(概率dp)
题目大意:给定n个事件,第i个事件发生的概率为pi,收益为ai,初始收益为k,求n个事件之后发生的事件数>=l且收益>=0的概率 收益只可能是正整数或-1. Solution dp[i][ ...
- 让Mac 可以使用mysql -u用户直接连接数据库
在执行完安装版本的mysql数据库后,会发现执行mysql还是会出现 command not found的错误:解决方案 方案1.设置软连接到/usr/local/bin下在命令行下输入如下 ln - ...
- bzoj1218 激光炸弹
bz上难得一见的水题啊. 我们发现:这个SB居然只要枚举就行了!!! 我TM...... /****************************************************** ...
- css3 media
@media screen and (max-width: 320px) { .cloud{position:;top: 70%;width: 150px;} .cloud2{;top: 30%;wi ...
- MSXML2.ServerXMLHTTP responseText 获取的内容不完整,解决方案
今天无意发现一个问题, 有个别几个网页使用 MSXML2.ServerXMLHTTP 获取网页源代码的时候,.responseText 总是返回一部分内容,无法获取完整的内容. 经过搜索,找到解决方案 ...
- 数据库之sql语句汇总20180616
/*******************************************************************************************/ 一.SQL简 ...
- var foo = function bar() {}
- Mysql数据约束 整理
数据约束 1.默认值: 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null CREATE TABLE ...
- Kademlia、DHT、KRPC、BitTorrent 协议、DHT Sniffer
catalogue . 引言 . Kademlia协议 . KRPC 协议 KRPC Protocol . DHT 公网嗅探器实现(DHT 爬虫) . BitTorrent协议 . uTP协议 . P ...
- SpringBoot实战一:发送邮件
目录 邮件协议 引入邮件包 创建邮件类和测试类,写yml文件 文本邮件,HTML邮件,附件邮件,图片邮件 模板邮件 异常处理 来进行一个SpringBoot项目的实战,发送一下邮件,这里我们先了解一下 ...