IL中间语言理解

IL :IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码

IL本身逻辑很清楚,主要是把指令的意思搞明白就好办了。记指令只要记住几个规律就好,大致可分为三类:
1.直观型
Add:将两个值相加并将结果推送到计算堆栈上
Sub:从其他值中减去一个值并将结果推送到计算堆栈上
Call:调用由传递的方法说明符指示的方法

2.加载(Id)和存储(st)
我们知道,C#程序运行时会有线程栈把参数,局部变量放上来,另外还有个计算栈用来做函数里的计算。所以把值加载到计算栈上,算完后再把计算栈上的值存到线程栈上去,这类指令专门干这些活。

比方说 ldloc.0:

这个可以拆开来看,Ld打头可以理解为Load,也就是加载;loc可以理解为local variable,也就是局部变量,后面的 .0表示索引。连起来的意思就是把索引为0的局部变量加载到计算栈上。对应的 ldloc.1就是把索引为1的局部变量加载到计算栈上,以此类推。
知道了Ld的意思,下面这些指令 也就很容易理解了。

ldstr = load string,

ldnull = load null,

ldobj = load object,

ldfld = load field,

3.比较指令,比较大小或判断bool值
有一部分是比较之后跳转的,代码里的 if 就会产生这些指令,符合条件则跳转执行另一些代码:

以b开头:beq, bge, bgt, ble, blt, bne

先把b去掉看看:
eq: equivalent with, ==
ge: greater than or equivalent with , >=

gt: greater than , >
le: less than or equivalent with, <=
lt: less than, <
ne: not equivalent with, !=

这样是不是很好理解了,beq IL_0005就是计算栈上两个值相等的话就跳转到IL_0005, ble IL_0023是第一个值小于或等于第二个值就跳转到IL_0023。

随手写段简单的代码,在命令行里输入:csc /debug- /optimize+ /out:program.exe Program.cs,打开IL查看工具:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\ildasm.exe,不同版本可能目录不太一样。打开刚编译的program.exe文件,如下:
在这里插入图片描述
双击节点就可以查看IL,如:

在这里插入图片描述

总结不易,如果对您有帮助,请一键三连,鼓励兔子发表更优秀的文章!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值