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 ...
随机推荐
- cf406E Hamming Triples (推公式)
考虑某两行a和b的dis 如果相同:$|a-b|$ 如果不同:$n-|a-b|$ 然后考虑三行的dis,不妨设a>=b>=c 那么有4种情况: 1.a,b,c 0/1的种类相同:$|a-b ...
- 关于一些没做出来的SBCF题
这里是一些我SB没做出来的CF水题. 其实这些题思维量还不错,所以写在这里常来看看…… 不一定每题代码都会写. CF1143C Queen 其实只要注意到如果一个点开始能被删,那一直就能被删:一个点开 ...
- nuxt.js实战之开发环境配置
一.创建项目 1.使用如下命令生成项目 vue init nuxt-community/starter-template testPro --testPro为项目名称 2.进入到项目根目录下,使用np ...
- HDU--5519 Sequence II (主席树)
题目链接 2016年长春ccpc I 题 题目大意 : 给你n(n≤2∗105n≤2∗105)个数,每个数的大小 0<Ai≤2∗10^5 0<Ai≤2∗10^5. 再给你m(m≤2∗1 ...
- Spring 声明式事务
事务的特性/概念 事务:一组操作要么都成功要么失败: 事务的四个关键属性(ACID): 原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上 ...
- tyvj/joyoi 1305 最大子序和
带了一个转化的单调队列裸题. 转化为前缀和相减即可. 有一点需要注意:从0开始入队而不是1,因为要统计第一个. (从网上找的对拍程序,结果别人写错了) /** freopen("in.in& ...
- 洛谷P4362 贪吃的九头龙
大意就是把一棵树的点染成m种颜色,其中1号点的颜色必须染恰好k个节点. 总代价是所有两端点颜色相同的边的边权. 求最小代价. 解:可以分为m == 2和m > 2两个题. m > 2时有代 ...
- Vue+koa2开发一款全栈小程序(3.vue入门、Mpvue入门)
1.Vue-cli 1.新建一个vue项目 打开cmd 官方命令行工具 npm install -g vue-cli //安装脚手架 cd到你想要存放demo的目录下,然后 vue init webp ...
- TP5.0+小程序商城构建(1)
1.导语 1.整体的思路与编程思想(大局观.AOP面向切面编程,10-20%) 2.具体的编程知识与技巧(TP5.小程序.数据库等80%) 2.课程内容与产品技术点 1.ThinkPHP5框架 1.编 ...
- 第十一篇- 实现APK打开文件功能
MainActivity.java package com.example.aimee.aimeetest3; import android.content.Context; import andro ...