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

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

转换为IL代码如下:

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

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

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

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

读懂IL代码(四)的更多相关文章

  1. 读懂IL代码就这么简单(三)完结篇

    一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍 这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认 ...

  2. 读懂IL代码就这么简单(二)

    一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...

  3. 读懂IL代码就这么简单 (一)

    一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...

  4. 读懂IL代码就这么简单

    原文地址:http://www.cnblogs.com/zery/p/3366175.html 一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不 ...

  5. 【转载】读懂IL代码就这么简单(三)完结篇

    一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认为 ...

  6. 【转载】读懂IL代码就这么简单(二)

    一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...

  7. 【转载】读懂IL代码就这么简单 (一)

    一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...

  8. 读懂IL代码就这么简单 ---- IL系列文章

    读懂IL代码就这么简单 (一) 读懂IL代码就这么简单(二) 读懂IL代码就这么简单(三)完结篇 出处:http://www.cnblogs.com/zery/tag/IL%20%E7%B3%BB%E ...

  9. 读懂IL代码(二)

    上一篇提到了最基本的IL代码,应该是比较通俗易懂的,所以有了上一篇的基础之后,这篇便要深入一点点的来讲述了. 首先我必须再来说一些重要的概念: Evaluation Stack(评估栈):这是由.NE ...

随机推荐

  1. strcmp函数实现及分析

    最近看C,看到strcmp函数,对它的实现原型不很清楚,于是到网上搜.网上算法一大堆,看了很多代码后自己做了一下总结 strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果 ...

  2. [CODEVS1220]数字三角形

    题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大. 输入描述 Input Description ...

  3. .net 加水印 图片变大很多 解决方法

    /// 给图片加水印 中国红木网          /// </summary>         /// <param name="originalImg"> ...

  4. window7电脑设置好了,却无法远程?

    设置远程连接: 步骤:右键[我的电脑]-->[属性] 点击[远程设置],然后设置如下: 在 cmd 中 通过 [ipconfig]命令查看IP: 以上设置好了,发现仍无法远程?解决办法如下: 电 ...

  5. SRM 358(1-250,500pt)

    DIV1 250pt 题意:电视目前停留在第100台,有一个遥控器,可以向上或向下换台(需要按键一次),也可以按一些数字,然后直接跳到该台(需要按键次数等于数字数,不需要按确定键).但是,这个遥控一些 ...

  6. jmeter http get 登录

      登录页url:http://www.ablesky.com/login.do?fromurl=http%3A%2F%2Fwww.ablesky.com%2Findex.do 登录参数用firebu ...

  7. Unicode与 utf8的互相转换

    <?php function unicode_encode($name) { $name = iconv('UTF-8', 'UCS-2', $name); $len = strlen($nam ...

  8. 子窗体与父窗体传值操作的js示例

    //返回值给父窗体 function returnParent(value) {//获取子窗体返回值    var parent = window.dialogArguments; //获取父页面   ...

  9. Excel中如何查找并列出所有链接(外部数据链接)?

    在 Excel 中,有时会需要创建外部链接来引用其他工作簿的单元格内容,但是如果想要找出所有链接并且还要将这些外部数据链接列在一个工作簿当中是有点难度的.下面我会介绍一些快捷方法,不仅能够快速帮你找出 ...

  10. allocator例子

    13.39 编写自己的StrVec,包括自己版本的reserve.capacity和resize. 13.40 为StrVec添加一个构造函数,它接受一个initializer_list<str ...