zoukankan      html  css  js  c++  java
  • 读懂IL代码(四)

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

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

    转换为IL代码如下:

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

    .method private hidebysig static void Main(string[] args)cilmanaged
    {
        .entrypoint //代表该函数程序的入口函数
        .maxstack 2 //评估栈可容纳数据项的最大个数
        .locals init (
            [0] int32 num, 
            [1] 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 "iu4e3au6574u6570" //把字符串“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 "iu4e3au8d1fu6570"//把字符串“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一下,你就应该知道了。

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

  • 相关阅读:
    BFS visit tree
    Kth Largest Element in an Array 解答
    Merge k Sorted Lists 解答
    Median of Two Sorted Arrays 解答
    Maximal Square 解答
    Best Time to Buy and Sell Stock III 解答
    Best Time to Buy and Sell Stock II 解答
    Best Time to Buy and Sell Stock 解答
    Triangle 解答
    Unique Binary Search Trees II 解答
  • 原文地址:https://www.cnblogs.com/Helius/p/5303514.html
Copyright © 2011-2022 走看看