2.【.Net底层剖析】2.stfld指令-给对象的字段赋值
1.准备工作
(1)新建一个project
using System; namespace newArr
{
class Program
{
static void Main(string[] args)
{
char[] arrchars = new char[];
for (int i = ; i < ; i++)
{
arrchars[i] = 'a';
Console.WriteLine(arrchars[i]);
}
Console.WriteLine("");
}
}
}
(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循环的代码的反编译代码就分析完了,请期待后续的文章。谢谢大家阅读本文章。