大內高手專欄:

.NET中間語言(IL)

作者:蔡學鏞

接續前頁

接著要執行第十道指令 ldloc.2。此指令的意思是:分別將 V2(也就是 k)的值放到 Evaluation Stack,這是相加前的準備動作。執行完此道指令之後,記憶體的變化如圖 11 所示:

對 11
圖 11

接著要執行第十一道指令 add。從 Evaluation Stack 取出兩個值,相加之後將結果放回 Evaluation Stack 中,此為 i+j+k 的值。執行完此道指令之後,記憶體的變化如圖 12 所示:

對 12
圖 12

接著要執行第十二道指令 stloc.3。從 Evaluation Stack 取出一個值,放到第 3 號變數(V3)中。這裡的第3號變數其實就是原始碼中的 answer。執行完此道指令之後,記憶體的變化如圖 13 所示:

對 13
圖 13

接著要執行第十三道指令 ldstr "i+j+k="。此指令的意思是:將 "i+j+k=" 的 Reference 放進 Evaluation Stack。執行完此道指令之後,記憶體的變化如圖 14 所示:

對 14
圖 14

接著要執行第十四道指令 ldloc.3。將 V3 的值放進 Evaluation Stack。執行完此道指令之後,記憶體的變化如圖 15 所示:

對 15
圖 15

接著要執行第十五道指令 box [mscorlib]System.Int32。此指令的意思是:從 Evaluation Stack 中取出一個值,將此 Value Type 包裝(box)成為 Reference Type。執行完此道指令之後,記憶體的變化如圖 16 所示:

對 16
圖 16

接著要執行第十六道指令 call string [mscorlib] System.String::Concat(object, object)。此指令的意思是:從 Evaluation Stack 中取出兩個值,此二值皆為 Reference Type,下面的值當作第一個參數,上面的值當作第二個參數,呼叫 mscorlib.dll 所提供的 System.String.Concat() method 來將此二參數進行字串接合(String Concatenation),將接合出來的新字串放在 Managed Heap,將其 Reference 放進 Evaluation Stack。值得注意的是:由於 System.String.Concat() 是 static method,所以此處使用的指令是 call,而非 callvirt(呼叫虛擬)。執行完此道指令之後,記憶體的變化如圖 17 所示:

對 17
圖 17

請注意:此時 Managed Heap 中的 Int32(6) 以及 String("i+j+k=") 已經不再被參考到,所以變成垃圾,等待 GC 的回收。

接著要執行第十七道指令 call void [mscorlib] System.Console::WriteLine(string)。此指令的意思是:從 Evaluation Stack 中取出一個值,此值為 Reference Type,將此值當作參數,呼叫 mscorlib.dll 所提供的 System.Console.WriteLine() method 來將此字串顯示在 Console 視窗上。System.Console.WriteLine() 也是 static method。執行完此道指令之後,記憶體的變化如圖 18 所示:

對 18
圖 18

接著要執行第十八道指令 ret。此指令的意思是:結束此次呼叫(也就是 Main 的呼叫)。此時會檢查 Evaluation Stack 內剩下的資料,由於 Main() 宣告不需要傳出值(void),所以 Evaluation Stack 內必須是空的,本範例符合這樣的情況,所以此時可以順利結束此次呼叫。而 Main 的呼叫一結束,程式也隨之結束。執行完此道指令之後(且在程式結束前),記憶體的變化如圖 19 所示:

對 19
圖 19

透過此範例,讀者應該可以對於 IL 有最基本的認識。對 IL 感興趣的讀者應該自行閱讀 Serge Lidin 所著的《Inside Microsoft .NET IL Assembler》(Microsoft Press 出版)。我認為:熟知 IL 每道指令的作用,是 .NET 程式員必備的知識。.NET 程式員可以不會用 IL Assembly 寫程式,但是至少要看得懂 ILDASM 反組譯出來的 IL 組合碼。

相關連結:

 序 - 何謂大內高手?
 .NET中間語言(IL)

意見與支援

 您有任何問題、意見或建議嗎?您可以透過下列電子郵件與作者連絡:
 xy.cai@msa.hinet.net

更多資訊

想知道大內高手專欄的其他文章嗎?請至此專欄所有列表