首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET CIL 系列第二篇:堆疊架構核心——Load/Store 與虛擬執行堆疊

     編輯:關於.NET

CIL 的堆疊本質

C# 等高階語言隱藏底層實作,但 CIL 實際上是完全基於堆疊的語言。虛擬執行堆疊負責:

  • Load(加載/入堆疊):將值壓入堆疊
  • Store(存儲/出堆疊):將堆疊頂端值移至記憶體(區域變數、參數、欄位)

鐵律: CIL 不允許直接存取任何資料(區域變數、參數、欄位),必須先 load 到堆疊,使用時再 pop。這解釋了 IL 程式碼看似冗餘的原因。

範例:PrintMessage 方法

public void PrintMessage() {
    string myMessage = "Hello";
    Console.WriteLine(myMessage);
}

對應 IL 程式碼

.method public hidebysig instance void PrintMessage() cil managed
{
  .maxstack 1
  .locals init ([0] string myMessage)
  IL_0000: nop
  IL_0001: ldstr "Hello"        // 載入字串常數到堆疊
  IL_0006: stloc.0              // 存儲堆疊頂端值到區域變數索引 0
  IL_0007: ldloc.0              // 載入區域變數索引 0 到堆疊
  IL_0008: call void [mscorlib]System.Console::WriteLine(string)
  IL_000d: nop
  IL_000e: ret
}

指令解析

  • .locals init ([0] string myMessage):宣告索引 0 的區域變數
  • ldstr:載入字串常數
  • stloc.0:存儲至區域變數 0(Store)
  • ldloc.0:載入區域變數 0(Load)
  • call:呼叫方法,消耗堆疊上的參數

堆疊操作指令分類

類別常用指令說明
常數載入ldc.i4, ldstr, ldnull載入數值、字串、null
區域變數ldloc, stloc, ldloca載入/存儲/取址區域變數
參數ldarg, starg, ldarga載入/存儲/取址方法參數
欄位ldfld, stfld, ldflda載入/存儲/取址實例/靜態欄位
陣列ldelem, stelem, ldelema載入/存儲/取址陣列元素

註解語法

IL 支援 // 單行與 /* ... */ 多行註解,編譯器會忽略。

本篇小結

理解「Load/Store 雙向流動」與「虛擬執行堆疊」是閱讀寫作 IL 的基石。下一篇將進入實戰:Round-trip Engineering 修改既有組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved