IL指令格式
一个方法中可以包含一条或多条IL指令,每条IL指令有三个部分组成,分别是标签、操作与参数.
以下面的IL指令为例,IL_0001是标签,ldstr是类型,“hello world”是参数。标签代表了该IL指令的位置,实现跳转的IL指令会把标签当作参数使用;类型代表IL指令执行了什么操作,相关常见指令见置顶文章;参数表示操作需要的值,有的IL指令类型可以不要参数,例如nop指令(代表什么都不做)。
IL_0001: ldstr "hello world"
评估堆栈(Evaluation Stack)
评估堆栈可以用于指令之间传递临时的数据,例如计算结果或者函数调用的返回值。
C#代码:
public static void Main(string[] args)
{
int a = 1;
Console.WriteLine(a + 2);
}
生成的IL指令如下:
.method public hidebysig static void
Main(
string[] args
) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int32 a
)
// [11 9 - 11 10]
IL_0000: nop
// [12 13 - 12 23]
IL_0001: ldc.i4.1
IL_0002: stloc.0 // a
// [13 13 - 13 38]
IL_0003: ldloc.0 // a
IL_0004: ldc.i4.2
IL_0005: add
IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
IL_000b: nop
// [16 9 - 16 10]
IL_000c: ret
} // end of method Program::Main