代码

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

1.准备工作(1)新建一个PRojectusingSystem;namespacenewArr

{classProgram

{staticvoidMain(string[] args)

{char[] arrchars =newchar[5];for(inti =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循环的代码的反编译代码就分析完了,请期待后续的文章。谢谢大家阅读本文章。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有