国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

【深入淺出.NetIL】1.一個For循環(huán)引發(fā)的IL

2019-11-14 15:43:49
字體:
供稿:網(wǎng)友

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

將整數(shù)5存放到Evaluation stack的頂部

 

4. IL_0002:  newarr     [mscorlib]System.Char

創(chuàng)建一個數(shù)組

5.  IL_0007:  stloc.0

Evalution Stack 頂部值彈出放在第一個變量arrchars

 

6.  IL_0008:  ldc.i4.0

將整數(shù)0壓入到Evalution Stack

7.  IL_0009:  stloc.1

Evalution Stack頂部的值0彈出存放到Local variable list的第2個變量i

 

8.  IL_000a:  br.s       IL_0020

無條件跳轉(zhuǎn)到地址:IL_0020

9.IL_0020:  ldloc.1

Local variable list中的第2個變量的值copy一份到Evaluation stack的頂部

 

10.  IL_0021:  ldc.i4.5

將整數(shù)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、非空或非零,則跳轉(zhuǎn)到IL_000c否則順序往下執(zhí)行。因為頂部的值為1,所以跳轉(zhuǎn)到地址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對應(yīng)的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)

調(diào)用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

將整數(shù)1壓入Evaluation Stack的頂部

 28. IL_001e:  add

Evaluation Stack頂部的兩個值相加,將結(jié)果1壓入Evaluation Stack的頂部

29.  IL_001f:  stloc.1

Evaluation Stack頂部的值1彈出存放到Local variable list的第二個變量中

30.重復(fù)執(zhí)行下面的指令

  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時,

執(zhí)行IL_0026:  brtrue.s   IL_000c  指令,順序往下執(zhí)行

32. IL_0028:  ldstr      "123"

將字符串"123"壓入壓入Evaluation Stack的頂部

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

調(diào)用Sys.Console.WriteLine(string)方法,打印"123"

34.  IL_0032:  nop

空操作

35.  IL_0033:  ret

返回

 

至此,這個for循環(huán)的代碼的反編譯代碼就分析完了,請期待后續(xù)的文章。謝謝大家閱讀本文章。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 那曲县| 宁明县| 同江市| 新泰市| 望奎县| 肃宁县| 泰兴市| 新巴尔虎右旗| 宁河县| 清远市| 红河县| 论坛| 巴林左旗| 湟中县| 江孜县| 南木林县| 麻江县| 新巴尔虎右旗| 洛扎县| 水城县| 永清县| 贵定县| 车险| 太原市| 临安市| 武威市| 海南省| 台东市| 霍林郭勒市| 徐汇区| 车险| 台南县| 潞城市| 北票市| 乌兰浩特市| 黔西县| 沂水县| 遂川县| 洛隆县| 社旗县| 松桃|