IL系列文章之一:Say Hello to IL

** IL ** ** 系列文章之一: **

** Say Hello to IL **

.net 出现这么就了,很多人已经能够熟练的运用 C# 进行软件开发,也有一些像我这样的人喜欢去研究一下 .net 的内部运行机制。我这里来谈谈 IL ( Intermediate Language ),虽然我们不太可能直接用 IL 来开发软件,但是 IL 的确是了解 .net 内部机制的一道大门。

Visual Studio.NET 给我们提供了两个与 IL 有关的工具 ilasm 和 ildasm ,他们是 IL 编译器和 IL 反编译器,有关它们的使用方法大家可以参看 MSND 文档,我这里就不再说了。不过在开始谈论 IL ,我还要谈下 CLR 基础。

CLR ( Common Language Runtime ), MSDN 文档也有一些对它的描述,我这里的描述只是对 MSDN 文档的一些补充,以使读者更好的理解 CLR 。 CLR 是 .net 框架的核心,可以把它想象成是一个可以运行 IL code 的 CPU 。就普通的 Intel CPU 而言,它是依靠 Register 和 Stack 来运行程序,而 CLR 则是一个只依靠 Stack 来运行程序的 CPU 。举一个例子,如果我们要进行 1 + 2 的运算,则 IL 指令会现将 1 和 2 移到 Stack 的顶部再进行 add 运算, add 把 1 和 2 从 Stack 顶部移走,再将运算结果 3 放到 Stack 顶部。 CLR 的 Stack 不是以 Byte 的形式存在,也不是以 Word 的形式存在,而是 Slot 。 Slot 是一种能够容纳任何类型实体的结构,就是说我们能够把 int 放到 Stack 中,也可以把 float 放到 Stack 中, Stack 中的内容可能是 int->float->object A->object B->int ,一切皆有可能。实体被移到 Stack 顶部的过程叫做 loading (简写成 ld ),把实体从 Stack 顶部移走的过程叫做 storing (简写成 st )。

好,现在让我们开始和 IL 亲密接触吧!看看我们的第一个 IL 程序——“ Hello World ”。

.assembly PrintString {}

//Console.WriteLine("Hello, World)"

.method static public void main() il managed

{

.entrypoint // IL 不用把 Main ()函数定义为程序的入口,而是用 .entrypoint 定义入口

.maxstack 8 // 定义 Stack 的最大深度为 8

// *****************************************************

// Console.WriteLine("Hello, World)";

// *****************************************************

ldstr "Hello, World" // 将“ Hello World ”这个 String 移到 Stack 顶部

// Call static System.Console.Writeline function

// WriteLine ()把 String 从 Stack 顶部移走,不返回任何值

call void [mscorlib]System.Console::WriteLine (class System.String)

// *****************************************************

ret

}

保存程序为 Hello.il ,然后就是编译它。打开“ Visual Studio .NET 命令提示”,切换到 Hello.il 所在的目录,输入“ ilasm Hello.il” , Enter 。 ilasm 会提示你编译成功,输入“ Hello ”, Enter 。就可以看到我们的程序的运行结果了。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus