IL中间语言理解学习001-Add加法解析

一、代码对比


1、源代码

private int add(int a, int b)
        {
            int c;
            c = a + b;
            return c;
        }

2、IL语言

.method 
private hidebysig instance int32 'add'(int32 a,int32 b) cil managed
{
  // 代码大小       11 (0xb)
  .maxstack  2
  .locals init ([0] int32 c,[1] int32 CS$1$0000) //声明局部变量 c 
  IL_0000:  nop
  IL_0001:  ldarg.1     //将索引为 1 的参数加载到计算堆栈上。
  IL_0002:  ldarg.2
  IL_0003:  add         //将两个值相加并将结果推送到计算堆栈上。
  IL_0004:  stloc.0    //从计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表中。
  IL_0005:  ldloc.0    //将索引 0 处的局部变量加载到计算堆栈上。
  IL_0006:  stloc.1    //从计算堆栈的顶部弹出当前值并将其存储到索引 1 处的局部变量列表中。
  IL_0007:  br.s       IL_0009   //无条件地将控制转移到目标指令 跳到IL_0009
  IL_0009:  ldloc.1    //将索引 1 处的局部变量加载到计算堆栈上。
  IL_000a:  ret        //从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。
} // end of method Form1::'add'

3、解释

关键字:
1. .locals:在IL 中,方法参数按照它们在参数列表中的位置依次被引用。如果方法是静态或共享方法,那么参数0则是参数列表中的第1个参数。而对实例方法来说,参数0则是指 向该方法所在类的实例的指针(Me或者this)。方法中的所有局部变量都在.locals标记的段落中以同样的方式声明。
2. ldarg:装载成员的一个参数,而LDARGA指令则装载参数的地址。变量由它们在.locals节中的位置标识。这些指令装载位置4及以后位置使用不同的语法,但是索引号仍然出现在指令中。
3. stloc:负责把堆栈最顶端的条目存入一个局部变量。存储指令指定变量的句法规则通常和它们对应的装载指令类似。
4. ldloc:把一个局部变量装入堆栈,另外还有一条LDLOCA指令把一个局部变量的地址(而非变量的内容)装入堆栈。变量由它们在.locals节的位置标识。这些指令装载位置4及以后位置使用不同的语法,但是索引号会出现在指令中。
5. br:IL分支指令(以BR开头)根据堆栈最顶端的条目中的内容跳到其他指令。Br.S无条件地将控制转移到目标指令(短格式)。
6. ret:从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值