博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读懂IL代码(四)
阅读量:5213 次
发布时间:2019-06-14

本文共 1339 字,大约阅读时间需要 4 分钟。

 这一篇是IL系列的最后一篇的,主要是要说一下IL中的流程控制。我相信,经过前面三篇的介绍,看IL代码应该不是什么大问题了吧。好吧,闲话不多说了,就来简单的说一下吧。

还是跟前几篇一样,以例子来解释说明。

转换为IL代码如下:

 

大家是否看到了上图中我画的红色框框,这个就是流程控制的关键,下面我最后一次一句一句去解释,希望大家能够自己去尝试一下,看一下。

.method private hidebysig static  ([] args)cilmanaged{    .entrypoint //代表该函数程序的入口函数    .maxstack 2 //评估栈可容纳数据项的最大个数    .locals init (        [0]  num,         [1]  flag) //声明两个变量,第一个是int类型,第二个是bool类型    L_0000:  //No Operation    L_0001:  //把数值2以4字节长度整数的形式压入评估栈    L_0002:   //把评估栈栈顶的值弹出,并赋值给第0个局部变量num,等于i=2的C#代码    L_0003:   //把第0个变量压入评估栈,即把变量num压入评估栈    L_0004:  //把数值0以4字节长度整数的形式压入评估栈    L_0005:   //执行大于指令操作,比较num和0,结果存储在评估栈栈顶,1表示真,即i>0为真    L_0007:  //把大于指令的运算结果从评估栈弹出,并赋值给第1个变量flag    L_0008:  //把第1个变量压入评估栈,即把变量flag压入评估栈    L_0009:  L_001a //如果brfalse为false,空引用或0,将控制转移到目标指令。在这里,因为i>0是为真,所以按顺序执行,不必跳到L_001a.    L_000b:  //No Operation    L_000c:  "i\u4e3a\u6574\u6570" //把字符串“i为整数”压入评估栈    L_0011:   []::()//调用WriteLine方法。    L_0016:      L_0017:      L_0018:  L_0027 //无条件地将控制转移到目标指令(短格式)。转移到调用ReadKey方法。    L_001a:      L_001b:  "i\u4e3a\u8d1f\u6570"//把字符串“i为负数”压入评估栈    L_0020:   []::()//调用WriteLine方法。    L_0025:      L_0026:      L_0027:  valuetype [] []::()    L_002c:  //清空评估栈的内容    L_002d:

好喽,这样就完整了噢。一般常用的指令都有说明。如果你在平时遇到了不懂的指令,可以到这里看看(),Ctrl+F一下,你就应该知道了。

其实我也是一名初学者,如果有什么问题的话,希望大家也可以提出来,我会进行改进。

转载于:https://www.cnblogs.com/Helius/p/5303514.html

你可能感兴趣的文章
常用到的多种锁(随时可能修改)
查看>>
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
Linq使用Join/在Razor中两次反射取属性值
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
【redis4 】
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
HDU-1242-Rescue
查看>>