IL 学习笔记

先上几篇博客链接:

  1. 一步步教你读懂NET中IL(图文详解)

  2. C#基础之IL

  3. 详解.NET IL代码

  4. C# IL DASM 使用

  5. 你必须知道的.NET

  6. 《C# to IL》、《Expert .NET 2.0 IL Assembler》等书籍的翻译博客

  7. 初识Ildasm.exe——IL反编译的实用工具

  8. Mono为何能跨平台?聊聊CIL(MSIL)

  9. 一个大神的CIL讲解专题

 

IL指令速记表

通过下面的速记表我们可以很容易的记忆CIL的指令:比如我们知道一个ldloc.0=ld(load)+loc(local)+.0(0位置的参数)=将索引 0 处的局部变量加载到计算堆栈上。

主要操作操作数范围/条件操作数类型操作数
缩写全称含义缩写全称含义缩写全称含义缩写全称含义
ldload将操作数压到堆栈当中,相当于:
push ax
argargument参数??操作数中的数值.0?第零个参数 *
.1?第一个参数
.2? 第二个参数
.3?第三个参数
.s xx(short)参数xx
aaddress操作数的地址只有 .s xx,参见ldarg.s
loclocal局部变量参见ldarg
fldfield字段(类的全局变量)参见ldargxx?xx字段,eg:
ldfld xx
cconst常量.i4int 4 bytesC#里面的int,其他的类型例如short需要通过conv转换.m1minus 1-1
.0?0
.1?1
 ……
.8 8
.s(short)后面跟一个字节以内的整型数值(有符号的)
??后面跟四个字节的整型数值
.i8int 8 bytesC#里面的long??后面跟八个字节的整型数值
.r4real 4 bytesC#里面的float??后面跟四个字节的浮点数值
.r8real 8 bytesC#里面的double??后面跟八个字节的浮点数值
nullnull空值(也就是0)??????
ststore将堆栈内容弹出到操作数中,相当于:
pop ax
参见ld **
convconvert数值类型转换,仅仅用纯粹的数值类型间的转换,例如int/float等???.i1int 1 bytesC#里面的sbyte???
.i2int 2 bytesC#里面的short
.i4int 4 bytesC#里面的int
.i8int 8 bytesC#里面的long
.r4real 4 bytesC#里面的float
.r8real 8 bytesC#里面的double
.u4uint 4 bytesC#里面的uint
.u8uint 8 bytesC#里面的ulong
b/brbranch条件和无条件跳转,相当于:
jmp/jxx label_jump
br??无条件跳转?????后面跟四个字节的偏移量(有符号)
.s(short)后面跟一个字节的偏移量(有符号)
falsefalse值为零的时候跳转???参见br
truetrue值不为零的时候跳转???
beqequal to相等???
nenot equal to不相等ununsigned or unordered无氟好的(对于整数)或者无序的(对于浮点)
gtgreater than大于
ltless than小于
gegreater than or equal to大于等于
leless than or equal to小于等于
callcall调用?????(非虚函数)?
???virtvirtual虚函数

 

 

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"的引用地址入栈,然后调用合并函数将栈顶前两个字符串连接起来,再将结果的引用放在栈顶。

转载于:https://www.cnblogs.com/jeason1997/p/6662326.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值