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 ...
随机推荐
- CANOE入门(二)
CAPL就是Communication Application Programming Laguage的缩写,CAPL类似于C语言的语法,因此所有的语法请参考C语言教程,这里不在这里进行详述,关于C语 ...
- HDU6280 From Tree to Graph
下午打了湘潭邀请赛,好像缓解了一下北京网络赛超强的自闭感.补一下这个图论题.(补了很久) 题意:给你一颗n节点的树,有m个操作,每次向xi和lca(xi,yi)连边,然后每次zi就是对于新的图在删除每 ...
- thinkphp5 如何使用查询事件?
它是对数据库的CURD操作事件进行了钩子,当事件触发时,会进行回调. 就像是注册事件和前置方法或后置方法类似 下面是demo <?php namespace app\index\controll ...
- linux复制文件到一个不存在的文件夹
复制文件到一个不存在的文件夹时,会报错 cp -f aaa /home/admin/.m2/cp: 无法创建普通文件"/home/admin/.m2/": 是一个目录 解决的方式: ...
- eureka集群基于DNS配置方式
https://www.cnblogs.com/relinson/p/eureka_ha_use_dns.html 最近在研究spring cloud eureka集群配置的时候碰到问题:多台eu ...
- 在MacOS上使用gdb(cgdb)调试Golang程序
如果你在MacOS上使用GDB工具载入Golang程序时无法载入,这篇文章可以解决.本文不具体介绍调试的方法,网上的文章太多了就不赘述了. cgdb使用的是gdb的内核,方法和原理试用本文. 问题分析 ...
- 2019.4.1考试&2019.4.2考试&2019.4.4考试
4.1:T1原题,T2码农板子题,T3板子题 4.2 好像是三个出题人分别出的 以及#define *** 傻逼 T1 思维好题 转成树形DP,$dp[i][j]$表示点i值为j的方案数,记录前缀和转 ...
- 用宏定义代替printf函数
来自:http://blog.csdn.net/yannanxiu/article/details/52506451 #define _DEBUG_ 1 #if _DEBUG_ #define PR( ...
- firfox中"content-disposition", "attachment;filename=“+filename不能显示文件名字
一般要在浏览器中显示文件名,可以使用以下文件名 // 设置文件名的编码方式,使得文件的名字能够正常安全的显示. filename = URLEncoder.encode(filename, " ...
- Luogu P2617 Dynamic Rankings
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...