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"); } }}
用IL Disassembler 工具打開exe文件
打開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循環的代碼的反編譯代碼就分析完了,請期待后續的文章。謝謝大家閱讀本文章。
新聞熱點
疑難解答