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”,Enterilasm会提示你编译成功,输入“Hello”,Enter。就可以看到我们的程序的运行结果了。 













本文转自周金桥51CTO博客,原文链接:http://blog.51cto.com/zhoufoxcn/164402 ,如需转载请自行联系原作者




相关文章
|
.NET C# C++
详解.NET IL代码(一)
  本文主要介绍IL代码,内容大部分来自网上,进行整理合并的。 一、IL简介  为什么要了解IL代码?   如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以通过IL代码透过表面看本质;IL也是更好理解、认识CLR的基础;大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;  什么是IL?   IL是.NET框架中中间语言(Intermediate Language)的缩写。
2259 0
【深入浅出.Net IL】1.一个For循环引发的IL
【深入浅出.Net IL】1.一个For循环引发的IL
132 0
【深入浅出.Net IL】1.一个For循环引发的IL
|
存储 缓存 物联网
IL指令速查
IL指令速查
150 0
|
Windows
如何通过ildasm/ilasm修改assembly的IL代码
  这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是“Could you file a bug report for this issue through Connect?”,绝望之后的又一次寒心啊。
997 0
|
开发框架 .NET 程序员
|
开发框架 .NET
|
开发框架 .NET 编译器
|
开发框架 .NET 程序员