.assembly extern mscorlib {}
.assembly Test
{
.ver 1:0:1:0
}
.module test.exe
.method static void main() cil managed
{
.maxstack 1
.entrypoint
ldstr "I am from the IL Assembly Language..."
call void [mscorlib]System.Console::WriteLine (string)
ret
}
这是MSIL汇编的hello world程序;保存为test1.il,
拷贝到.netframework目录,然后用ilasm构建,结果如下;
先看一下main()方法中的前2条语句;
第一条指令是最大栈(.maxstack 1),它告诉编译器我们要加载到内存(实际是评估堆栈)中去的项的最大数目;
第二条,.entrypoint 指令告诉编译器去把这个函数标记为整个应用程序的入口点(Entry Point ),也就是执行这个应用程序时最先执行的函数。
上面提到评估堆栈,看一下什么是评估堆栈;
Evaluation Stack,有时翻译为评估堆栈,
Evaluation Stack
是一个非常重要的数据结构,它在内存分配和我们的应用之间起桥梁作用,所有的计算、结果数据的移入移出都要通过它,它是一个LIFO的栈,例如我们可以用各种load指令来从其它存储区取得数据放入Evaluation Stack,可以看成是push(压栈),也可以使用各种store指令来将当前计算结果存储到相应的存储区,可以看成是pop(出栈)。
如果方法没有返回值则要保证方法调用结束时,Evaluation Stack为空,如果有返回值则方法调用结束的时候Evaluation Stack只存该返回值,如果违反上述规则,则运行时会抛出InvalidProgramException的异常。
这是网上资料的一个图,Evaluation Stack 和其它存储区的关系如下:
我还不太理解,有时间继续;