【深入淺出.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循環的代碼的反編譯代碼就分析完了,請期待后續的文章。謝謝大家閱讀本文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM