.NET IL代码 解读

什么是IL

IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码。

语法解释:
Nop:如果修补操作码,则填充空间。尽管可能消耗处理周期,但未执行任何有意义的操作。
Ldstr:推送对元数据中存储的字符串的新对象引用。
Ldlloca:将位于特定索引处的局部变量的地址加载到计算堆栈上。
Ldloca.S:将位于特定索引处的局部变量的地址加载到计算堆栈上(短格式)。
Ldc.I4.S:将提供的 int8 值作为 int32 推送到计算堆栈上(短格式)。
Stfld:用新值替换在对象引用或指针的字段中存储的值。
Ldloc.0:将索引 0 处的局部变量加载到计算堆栈上。
Ldfld:查找对象中其引用当前位于计算堆栈的字段的值。
Ldflda:查找对象中其引用当前位于计算堆栈的字段的地址。
Stloc:从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中。
Ret:从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。

.maxstack 3 // 定义函数代码所用堆栈的最大深度,也指Evaluation Stackk中最多能同时存在3个值
.entrypoint // 程序入口
.locals init // 初始化代码
(
[0] int32 number,
[1] object numberString,
[2] int32 myNumber
)
IL_0000: nop // 即No Operation 没有任何操作,我们也不用管它
IL_0001: ldc.i4.1 // 加载第一个变量"i"的值 (压入Evaluation Stack中)
IL_0002: stloc.0 // 从栈中把"i"的值弹出并赋值给Record Frame中第0个位置(V_0)
IL_0003: ldc.i4.2 // 加载第二个变量"j"的值 (压入Evaluation Stack中)
IL_0004: stloc.1 // 从栈中把"j"的值弹出并赋值给Record Frame中第1个位置(V_1)
IL_0005: ldc.i4.3 // 加载第三个变量"k"的值 (压入Evaluation Stack中)
IL_0006: stloc.2 // 从栈中把 "k"的值弹出并赋值给Record Frame中第2个位置(V_2)

// 上面代码初始化完成后要开始输出了,所以要把数据从Record Frame中取出

IL_0007: ldloc.0 // 取Record Frame中位置为0的元素(V_0)的值("i"的值)并压入栈中 (相当于Copy一份值Call Stack中V_0的值。V_0本身的值是不变的)
IL_0008: ldloc.1 // 取Record Frame中位置为1的元素(V_1)的值("j"的值)并压入栈中 (同上)
IL_0009: add // 做加法操作
IL_000a: ldloc.2 // 取出Record Frame中位置为2的元素(V_2)的值("k"的值)并压入栈中
IL_000b: add // 做加法操作
IL_000c: call void [mscorlib]System.Console::WriteLine(int32) //调用输出方法
IL_0011: nop
IL_0012: ret // 即为 return 标记 返回值

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值