MSIL简介

来源:互联网 发布:linux上svn创建项目 编辑:程序博客网 时间:2024/05/25 19:57

原文链接

让我们从一个简单的main函数开始。和C#不同,CLI不要求一个方法属于一个类。入口函数也不一定要叫做main;但是为了简单起见,我将会使用这个命名。

.method static void main(){    .entrypoint    .maxstack 1    ldstr "Hello world!"    call void [mscorlib]System.Console::WriteLine(string)    ret}

main函数被称作函数定义,因为同时提供了签名和函数体。相反,当只提供了函数签名,而没有提供函数体时,它被称为函数声明。函数声明经常被当作调用对象使用,而函数定义提供了真正的实现。

一个函数定义由 .method 指令开始,并在全局作用域或者一个类中被定义。程序入口必须是静态的,意味着调用这个函数不需要实例,我们使用static关键字来表示。声明一个全局函数是静态的看起来是冗余的,但是如果你在某些情况下忽略了static关键字,那么ILASM编译器就会发脾气。如果函数签名变为 ’ void main() ‘,那么就表示不返回值,并且不需要参数。

.entrypoint 指令告诉运行时这个函数是这个程序的入口。一个程序只能有个一个方法用这个指令指示。

.maxstack 指令表示这个函数希望有多少个栈槽。比如把两个数相加需要把这两个数都推入栈中并调用add指令,add指令会把两个数从栈中弹出,并把返回值推到栈中,那么你将需要两个栈槽。

ldstr指令把字符串推入栈中,在Writeline函数中作为参数。call指令调用 System.Console类中的静态函数Writeline,这是一个函数声明的例子。它提供了Writeline函数完整的签名,所以运行时可以确定调用哪个WriteLine。

最后ret指令返回控制权给调用者。在入口函数中调用它,会导致程序结束。

0 0
原创粉丝点击