zoukankan      html  css  js  c++  java
  • 【深入浅出.Net IL】1.一个For循环引发的IL

    .Net底层剖析目录章节

    1.【深入浅出.Net IL】1.一个For循环引发的IL 

    2.【.Net底层剖析】2.stfld指令-给对象的字段赋值

    3.【.Net底层剖析】3.用IL来理解属性

    1.准备工作

    1)新建一个project

    using System;
    
    namespace newArr
    {
        class Program
        {
            static void Main(string[] args)
            {
                char[] arrchars = new char[5];
                for (int i = 0; i < 5; i++)
                {
                    arrchars[i] = 'a';
                    Console.WriteLine(arrchars[i]);
                }
                Console.WriteLine("123");
            }
        }
    }

    2)编译并生成exe文件

    IL Disassembler 工具打开exe文件

    2.分析IL代码

    打开Main方法

    分析指令

    1.初始化 local variable List

     .locals init ([0] char[] arrchars,

               [1] int32 i,

               [2] bool CS$4$0000)   

    2.IL_0000:  nop 

    空操作

    3.IL_0001:  ldc.i4.5

    将整数5存放到Evaluation stack的顶部

    4. IL_0002:  newarr     [mscorlib]System.Char

    创建一个数组

    5.  IL_0007:  stloc.0

    Evalution Stack 顶部值弹出放在第一个变量arrchars

    6.  IL_0008:  ldc.i4.0

    将整数0压入到Evalution Stack

    7.  IL_0009:  stloc.1

    Evalution Stack顶部的值0弹出存放到Local variable list的第2个变量i

    8.  IL_000a:  br.s       IL_0020

    无条件跳转到地址:IL_0020

    9.IL_0020:  ldloc.1

    Local variable list中的第2个变量的值copy一份到Evaluation stack的顶部

    10.  IL_0021:  ldc.i4.5

    将整数5存放到Evaluation Stack的顶部

     

    11.IL_0022:  clt

    比较Evaluation Stack顶部的两个值,如果0<5则将1存放到Evaluation Stack顶部,否则将0存放到Evaluation Stack顶部

    12.  IL_0024:  stloc.2

    Evaluation Stack顶部的值1弹出存放到Local variable list的第二个变量中

    13.  IL_0025:  ldloc.2

    Local variable list中的第二个变量的值copy一份到Evaluation stack的顶部

    14.  IL_0026:  brtrue.s   IL_000c

    判断Evaluation Stack顶部的值为true、非空或非零,则跳转到IL_000c否则顺序往下执行。因为顶部的值为1,所以跳转到地址IL_000c

    15.  IL_000c:  nop

    空操作

    16.  IL_000d:  ldloc.0

    Local variable list中的第1个变量的值copy一份到Evaluation Stack的顶部

    17.  IL_000e:  ldloc.1

    Local variable list中的第2个变量的值copy一份到Evaluation Stack的顶部

    18.IL_000f:  ldc.i4.s   97

    97对应的ACISS 码为'a',将'a'存放到Evaluation Stack的顶部

    19.  IL_0011:  stelem.i2

    arrchars[0]赋值为'a',将arrchars[0]的值存放到Local variable list的变量arrchars

    20.  IL_0012:  ldloc.0

    Local variable list中的第1个变量的值copy一份到Evaluation Stack的顶部

    21. IL_0013:  ldloc.1

    Local variable list中的第2个变量的值copy一份到Evaluation Stack的顶部

    22.  IL_0014:  ldelem.u2

    arrchars[0]压入Evaluation Stack的顶部

     

    23.  IL_0015:  call       void [mscorlib]System.Console::WriteLine(char)

    调用System.Console.WriteLine(char)方法打印'a'

    24.  IL_001a:  nop

    空操作

    25.  IL_001b:  nop

    空操作

    26.  IL_001c:  ldloc.1

    Local variable list中的第2个变量的值copy一份到Evaluation Stack的顶部

    27.  IL_001d:  ldc.i4.1

    将整数1压入Evaluation Stack的顶部

     28. IL_001e:  add

    Evaluation Stack顶部的两个值相加,将结果1压入Evaluation Stack的顶部

    29.  IL_001f:  stloc.1

    Evaluation Stack顶部的值1弹出存放到Local variable list的第二个变量中

    30.重复执行下面的指令

      IL_0020:  ldloc.1

      IL_0021:  ldc.i4.5

      IL_0022:  clt

      IL_0024:  stloc.2

      IL_0025:  ldloc.2

      IL_0026:  brtrue.s   IL_000c

    31.Local variable list的第二个变量等于5时,

    执行IL_0026:  brtrue.s   IL_000c  指令,顺序往下执行

    32. IL_0028:  ldstr      "123"

    将字符串"123"压入压入Evaluation Stack的顶部

    33.  IL_002d:  call       void [mscorlib]System.Console::WriteLine(string)

    调用Sys.Console.WriteLine(string)方法,打印"123"

    34.  IL_0032:  nop

    空操作

    35.  IL_0033:  ret

    返回

     

    至此,这个for循环的代码的反编译代码就分析完了,请期待后续的文章。谢谢大家阅读本文章。

  • 相关阅读:
    C#最小化到托盘+双击托盘恢复
    WinForm最小化到托盘以及托盘右键菜单
    WinForm最小化到托盘以及托盘右键菜单
    System.Dynamic.ExpandoObject 类型的简单使用
    System.Dynamic.ExpandoObject 类型的简单使用
    C# 操作MongoDB时间 时差问题
    C# 操作MongoDB时间 时差问题
    C# typeof() 和 GetType()区别是什么?
    C++ 文件操作之修改文件某一行数据
    C# typeof() 和 GetType()区别是什么?
  • 原文地址:https://www.cnblogs.com/jackson0714/p/4975831.html
Copyright © 2011-2022 走看看