系列文章之一: Say Hello to IL .net 出現這么就了,很多人已經能夠熟練的運用 C# 進行軟件 開發 ,也有一些像我這樣的人喜歡去研究一下 .net 的內" name="description" />
ILMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列文章之一:
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。就可以看到我們的程序的運行結果了。
原文轉自:http://www.anti-gravitydesign.com