.NET框架中間語言IL指令大全

黄舟
發布: 2017-02-22 10:40:52
原創
2106 人瀏覽過

IL是.NET框架中中間語言(Intermediate Language)的縮寫。使用.NET框架提供的編譯器可以直接將原始程式編譯為.exe或.dll文件,但此時編譯出來的程式碼並不是CPU能直接執行的機器碼,而是一種中間語言IL(Intermediate Language )的代碼。

#
名稱 說明
#Add 將兩個值相加並將結果推送到計算堆疊上。
Add.Ovf 將兩個整數相加,執行溢位檢查,並將結果推送到計算堆疊上。
Add.Ovf.Un 將兩個無符號整數值相加,執行溢位檢查,並將結果推送到計算堆疊上。
And 計算兩個值的位元「與」並將結果推送到計算堆疊上。
Arglist 傳回指向目前方法的參數清單的非託管指標。
Beq 如果兩個值相等,則將控制權轉移到目標指令。
Beq.S 如果兩個值相等,則將控制權轉移到目標指令(短格式)。
Bge 如果第一個值大於或等於第二個值,則將控制權轉移到目標指令。
Bge.S 如果第一個值大於或等於第二個值,則將控制權轉移到目標指令(短格式)。
Bge.Un 當比較無符號整數值或不可排序的浮點型值時,如果第一個值大於第二個值,則將控制權轉移到目標指令。
Bge.Un.S 當比較無符號整數值或不可排序的浮點型值時,如果第一個值大於第二個值,則將控制權轉移到目標指令(短格式)。
Bgt 如果第一個值大於第二個值,則將控制權轉移到目標指令。
Bgt.S 如果第一個值大於第二個值,則將控制權轉移到目標指令(短格式)。
Bgt.Un 當比較無符號整數值或不可排序的浮點型值時,如果第一個值大於第二個值,則將控制權轉移到目標指令。
Bgt.Un.S 當比較無符號整數值或不可排序的浮點型值時,如果第一個值大於第二個值,則將控制權轉移到目標指令(短格式)。
Ble 如果第一個值小於或等於第二個值,則將控制權轉移到目標指令。
Ble.S 如果第一個值小於或等於第二個值,則將控制權轉移到目標指令(短格式)。
Ble.Un 當比較無符號整數值或不可排序的浮點型值時,如果第一個值小於或等於第二個值,則將控制權轉移到目標指令。
Ble.Un.S 當比較無符號整數值或不可排序的浮點值時,如果第一個值小於或等於第二個值,則將控制權轉移到目標指令(短格式)。
Blt 如果第一個值小於第二個值,則將控制權轉移到目標指令。
Blt.S 如果第一個值小於第二個值,則將控制權轉移到目標指令(短格式)。
Blt.Un 當比較無符號整數值或不可排序的浮點型值時,如果第一個值小於第二個值,則將控制權轉移到目標指令。
Blt.Un.S 當比較無符號整數值或不可排序的浮點型值時,如果第一個值小於第二個值,則將控制權轉移到目標指令(短格式)。
Bne.Un 當兩個無符號整數值或不可排序的浮點型值不相等時,將控制權轉移到目標指令。
Bne.Un.S 當兩個無符號整數值或不可排序的浮點型值不相等時,將控制權轉移到目標指令(短格式)。
Box 將值類別轉換為物件參考(O 型別)。
Br 無條件地將控制權轉移到目標指令。
Br.S 無條件地將控制權轉移到目標指令(短格式)。
Break 向公共語言結構 (CLI) 發出訊號以通知偵錯器已撞上了一個斷點。
Brfalse 如果 value 為 false、空參考(Visual Basic 中的 Nothing)或零,則將控制權轉移到目標指令。
Brfalse.S 如果 value 為 false、空引用或零,則將控制權轉移到目標指令。
Brtrue 如果 value 為 true、非空或非零,則將控制權轉移到目標指令。
Brtrue.S 如果 value 為 true、非空或非零,則將控制權轉移到目標指令(短格式)。
Call 呼叫由傳遞的方法說明符指示的方法。
Calli 透過呼叫約定描述的參數來呼叫在計算堆疊上指示的方法(作為指向入口點的指標)。
Callvirt 對物件呼叫後期綁定方法,並且將回傳值推送到計算堆疊上。
Castclass 嘗試將引用傳遞的物件轉換為指定的類別。
Ceq 比較兩個值。如果這兩個值相等,則將整數值 1 (int32) 推送到計算堆疊上;否則,將 0 (int32) 推送到計算堆疊上。
Cgt 比較兩個值。如果第一個值大於第二個值,則將整數值 1 (int32) 推送到計算堆疊上;反之,將 0 (int32) 推送到計算堆疊上。
Cgt.Un 比較兩個無符號的或不可排序的值。如果第一個值大於第二個值,則將整數值 1 (int32) 推送到計算堆疊上;反之,將 0 (int32) 推送到計算堆疊上。
Ckfinite 如果值不是有限數,​​則引發 ArithmeticException。
Clt 比較兩個值。如果第一個值小於第二個值,則將整數值 1 (int32) 推送到計算堆疊上;反之,將 0 (int32) 推送到計算堆疊上。
Clt.Un 比較無符號的或不可排序的值 value1 和 value2。如果 value1 小於 value2,則將整數值 1 (int32 ) 推送到計算堆疊上;反之,將 0 ( int32 ) 推送到計算堆疊上。
Constrained 約束要對其進行虛擬方法呼叫的型別。
Conv.I 將位於計算堆疊頂部的值轉換為 native int。
Conv.I1 將位於計算堆疊頂部的值轉換為 int8,然後將其擴展(填充)為 int32。
Conv.I2 將位於計算堆疊頂部的值轉換為 int16,然後將其擴展(填充)為 int32。
Conv.I4 將位於計算堆疊頂部的值轉換為 int32。
Conv.I8 將位於計算堆疊頂部的值轉換為 int64。
Conv.Ovf.I 將位於計算堆疊頂部的有符號值轉換為有符號 native int,並在溢位時引發 OverflowException。
Conv.Ovf.I.Un 將位於計算堆疊頂部的無符號值轉換為有符號 native int,並在溢位時引發 OverflowException。
Conv.Ovf.I1 將位於計算堆疊頂部的有符號值轉換為有符號int8 並將其擴展為int32,並在溢位時引發OverflowException 。
Conv.Ovf.I1.Un 將位於計算堆疊頂部的無符號值轉換為有符號int8 並將其擴展為int32,並在溢位時引發OverflowException。
Conv.Ovf.I2 將位於計算堆疊頂部的有符號值轉換為有符號int16 並將其擴展為int32,並在溢位時引發OverflowException 。
Conv.Ovf.I2.Un 將位於計算堆疊頂部的無符號值轉換為有符號int16 並將其擴展為int32,並在溢位時引發OverflowException。
Conv.Ovf.I4 將位於計算堆疊頂部的有符號值轉換為有符號 int32,並在溢位時引發 OverflowException。
Conv.Ovf.I4.Un 將位於計算堆疊頂部的無符號值轉換為有符號 int32,並在溢位時引發 OverflowException。
Conv.Ovf.I8 將位於計算堆疊頂部的有符號值轉換為有符號 int64,並在溢位時引發 OverflowException。
Conv.Ovf.I8.Un 將位於計算堆疊頂部的無符號值轉換為有符號 int64,並在溢位時引發 OverflowException。
Conv.Ovf.U 將位於計算堆疊頂端的有符號值轉換為 unsigned native int,並在溢位時引發 OverflowException。
Conv.Ovf.U.Un 將位於計算堆疊頂部的無符號值轉換為 unsigned native int,並在溢位時引發 OverflowException。
Conv.Ovf.U1 將位於計算堆疊頂部的有符號值轉換為 unsigned int8 並將其擴展為 int32,並在溢位時引發 OverflowException。
Conv.Ovf.U1.Un 將位於計算堆疊頂部的無符號值轉換為unsigned int8 並將其擴展為int32,並在溢位時引發OverflowException。
Conv.Ovf.U2 將位於計算堆疊頂部的有符號值轉換為 unsigned int16 並將其擴展為 int32,並在溢位時引發 OverflowException。
Conv.Ovf.U2.Un 將位於計算堆疊頂部的無符號值轉換為unsigned int16 並將其擴展為int32,並在溢位時引發OverflowException。
Conv.Ovf.U4 將位於計算堆疊頂部的有符號值轉換為 unsigned int32,並在溢位時引發 OverflowException。
Conv.Ovf.U4.Un 將位於計算堆疊頂部的無符號值轉換為 unsigned int32,並在溢位時引發 OverflowException。
Conv.Ovf.U8 將位於計算堆疊頂端的有符號值轉換為 unsigned int64,並在溢位時引發 OverflowException。
Conv.Ovf.U8.Un 將位於計算堆疊頂部的無符號值轉換為 unsigned int64,並在溢位時引發 OverflowException。
Conv.R.Un 將位於計算堆疊頂端的無符號整數值轉換為 float32。
Conv.R4 將位於計算堆疊頂端的值轉換為 float32。
Conv.R8 將位於計算堆疊頂端的值轉換為 float64。
Conv.U 將位於計算堆疊頂部的值轉換為 unsigned native int,然後將其擴展為 native int。
Conv.U1 將位於計算堆疊頂部的值轉換為 unsigned int8,然後將其擴展為 int32。
Conv.U2 將位於計算堆疊頂部的值轉換為 unsigned int16,然後將其擴展為 int32。
Conv.U4 將位於計算堆疊頂部的值轉換為 unsigned int32,然後將其擴展為 int32。
Conv.U8 將位於計算堆疊頂部的值轉換為 unsigned int64,然後將其擴展為 int64。
Cpblk 將指定數目的位元組從來源位址複製到目標位址。
Cpobj 將位於物件(&、* 或native int 型別)位址的值型別複製到目標物件(&、* 或native int 型別)的位址。
p 將兩個值相除並將結果作為浮點(F 類型)或商(int32 類型)推送到計算堆疊上。
p.Un 兩個無符號整數值相除並將結果 ( int32 ) 推送到計算堆疊上。
Dup 複製計算堆疊上目前最頂端的值,然後將副本推送到計算堆疊上。
Endfilter 將控制從異常的 filter 子句轉移回公共語言結構 (CLI) 例外處理程序。
Endfinally 將控制從例外區塊的 fault 或 finally 子句轉移回公共語言結構 (CLI) 例外處理程序。
Initblk 將位於特定位址的記憶體的指定區塊初始化為給定大小和初始值。
Initobj 將位於指定位址的值類型的每個欄位初始化為空引用或適當的基元類型的 0。
Isinst 測試物件引用(O 型別)是否為特定類別的實例。
Jmp 退出目前方法並跳至指定方法。
Ldarg 將參數(由指定索引值參考)載入到堆疊上。
Ldarg.0 將索引為 0 的參數載入到計算堆疊上。
Ldarg.1 將索引為 1 的參數載入到計算堆疊上。
Ldarg.2 將索引為 2 的參數載入到計算堆疊上。
Ldarg.3 將索引為 3 的參數載入到計算堆疊上。
Ldarg.S 將參數(由指定的短格式索引引用)載入到計算堆疊上。
Ldarga 將參數位址載入到計算堆疊上。
Ldarga.S 以短格式將參數位址載入到計算堆疊上。
Ldc.I4 將所提供的 int32 類型的值作為 int32 推送到計算堆疊上。
Ldc.I4.0 將整數值 0 作為 int32 推送到計算堆疊上。
Ldc.I4.1 將整數值 1 作為 int32 推送到計算堆疊上。
Ldc.I4.2 將整數值 2 作為 int32 推送到計算堆疊上。
Ldc.I4.3 將整數值 3 作為 int32 推送到計算堆疊上。
Ldc.I4.4 將整數值 4 作為 int32 推送到計算堆疊上。
Ldc.I4.5 將整數值 5 作為 int32 推送到計算堆疊上。
Ldc.I4.6 將整數值 6 作為 int32 推送到計算堆疊上。
Ldc.I4.7 將整數值 7 作為 int32 推送到計算堆疊上。
Ldc.I4.8 將整數值 8 作為 int32 推送到計算堆疊上。
Ldc.I4.M1 將整數值 -1 作為 int32 推送到計算堆疊上。
Ldc.I4.S 將提供的 int8 值作為 int32 推送到計算堆疊上(短格式)。
Ldc.I8 將所提供的 int64 類型的值作為 int64 推送到計算堆疊上。
Ldc.R4 將所提供的 float32 類型的值作為 F (float) 類型推送到計算堆疊上。
Ldc.R8 將所提供的 float64 類型的值作為 F (float) 類型推送到計算堆疊上。
Ldelem 依照指令中指定的類型,將指定陣列索引中的元素載入到計算堆疊的頂端。
Ldelem.I 將位於指定陣列索引處的 native int 類型的元素作為 native int 載入到計算堆疊的頂部。
Ldelem.I1 將位於指定陣列索引處的 int8 類型的元素作為 int32 載入到計算堆疊的頂部。
Ldelem.I2 將位於指定陣列索引處的 int16 類型的元素作為 int32 載入到計算堆疊的頂部。
Ldelem.I4 將位於指定陣列索引處的 int32 類型的元素作為 int32 載入到計算堆疊的頂部。
Ldelem.I8 將位於指定陣列索引處的 int64 類型的元素作為 int64 載入到計算堆疊的頂部。
Ldelem.R4 將位於指定陣列索引處的 float32 類型的元素作為 F 類型(浮點型)載入到計算堆疊的頂部。
Ldelem.R8 將位於指定陣列索引處的 float64 類型的元素作為 F 類型(浮點型)載入到計算堆疊的頂部。
Ldelem.Ref 將位於指定陣列索引處的包含物件參考的元素作為 O 類型(物件參考)載入到計算堆疊的頂部。
Ldelem.U1 將位於指定陣列索引處的 unsigned int8 類型的元素作為 int32 載入到計算堆疊的頂部。
Ldelem.U2 將位於指定陣列索引處的 unsigned int16 類型的元素作為 int32 載入到計算堆疊的頂部。
Ldelem.U4 將位於指定陣列索引處的 unsigned int32 類型的元素作為 int32 載入到計算堆疊的頂部。
Ldelema 將位於指定陣列索引的陣列元素的位址作為 & 類型(託管指標)載入到計算堆疊的頂部。
Ldfld 尋找物件中其引用目前位於計算堆疊的欄位的值。
Ldflda 尋找物件中其引用目前位於計算堆疊的欄位的位址。
Ldftn 將指向實作特定方法的本機程式碼的非託管指標(native int 類型)推送到計算堆疊上。
Ldind.I 將 native int 類型的值作為 native int 間接載入到計算堆疊上。
Ldind.I1 將 int8 類型的值作為 int32 間接載入到計算堆疊上。
Ldind.I2 將 int16 類型的值作為 int32 間接載入到計算堆疊上。
Ldind.I4 將 int32 類型的值作為 int32 間接載入到計算堆疊上。
Ldind.I8 將 int64 類型的值作為 int64 間接載入到計算堆疊上。
Ldind.R4 將 float32 類型的值作為 F (float) 類型間接載入到計算堆疊上。
Ldind.R8 將 float64 類型的值作為 F (float) 類型間接載入到計算堆疊上。
Ldind.Ref 將物件參考作為 O(物件參考)類型間接載入到計算堆疊上。
Ldind.U1 將 unsigned int8 類型的值作為 int32 間接載入到計算堆疊上。
Ldind.U2 將 unsigned int16 類型的值作為 int32 間接載入到計算堆疊上。
Ldind.U4 將 unsigned int32 類型的值作為 int32 間接載入到計算堆疊上。
Ldlen 將從零開始的、一維數組的元素的數目推送到計算堆疊上。
Ldloc 將指定索引處的局部變數載入到計算堆疊上。
Ldloc.0 將索引 0 處的局部變數載入到計算堆疊上。
Ldloc.1 將索引 1 處的局部變數載入到計算堆疊上。
Ldloc.2 將索引 2 處的局部變數載入到計算堆疊上。
Ldloc.3 將索引 3 處的局部變數載入到計算堆疊上。
Ldloc.S 將特定索引處的局部變數載入到計算堆疊上(短格式)。
Ldloca 將位於特定索引處的局部變數的位址載入到計算堆疊上。
Ldloca.S 將位於特定索引處的局部變數的位址載入到計算堆疊上(短格式)。
Ldnull 將空引用(O 類型)推送到計算堆疊上。
Ldobj 將位址指向的值類型物件複製到計算堆疊的頂部。
Ldsfld 將靜態欄位的值推送到計算堆疊上。
Ldsflda 將靜態欄位的位址推送到計算堆疊上。
Ldstr 推送對元資料中儲存的字串的新物件參考。
Ldtoken 將元資料標記轉換為其執行時間表示形式,並將其推送到計算堆疊上。
Ldvirtftn 將指向實作與指定物件關聯的特定虛擬方法的本機程式碼的非託管指標(native int 型別)推送到計算堆疊上。
Leave 退出受保護的程式碼區域,無條件將控制權轉移到特定目標指令。
Leave.S 退出受保護的程式碼區域,無條件將控制權轉移到目標指令(縮寫形式)。
Localloc 從本地動態記憶體池分配特定數目的位元組並將第一個分配的位元組的位址(瞬態指針,* 類型)推送到計算堆疊上。
Mkrefany 將對特定類型實例的類型化參考推送到計算堆疊上。
Mul 將兩個值相乘並將結果推送到計算堆疊上。
Mul.Ovf 將兩個整數值相乘,執行溢位檢查,並將結果推送到計算堆疊上。
Mul.Ovf.Un 將兩個無符號整數值相乘,執行溢位檢查,並將結果推送到計算堆疊上。
Neg 對一個值執行求反並將結果推送到計算堆疊上。
Newarr 將對新的從零開始的一維數組(其元素屬於特定類型)的物件參考推送到計算堆疊上。
Newobj 建立一個值類型的新物件或新實例,並將物件參考(O 類型)推送到計算堆疊上。
Nop 如果修補操作碼,則填入空間。儘管可能消耗處理週期,但未執行任何有意義的操作。
Not 計算堆疊頂部整數值的位元求補並將結果作為相同的類型推送到計算堆疊上。
Or 計算位於堆疊頂部的兩個整數值的位元求補並將結果推送到計算堆疊上。
Pop 移除目前位於計算堆疊頂端的值。
Prefix1 基礎架構。此指令為保留指令。
Prefix2 基礎架構。此指令為保留指令。
Prefix3 基礎架構。此指令為保留指令。
Prefix4 基礎架構。此指令為保留指令。
Prefix5 基礎架構。此指令為保留指令。
Prefix6 基礎架構。此指令為保留指令。
Prefix7 基礎架構。此指令為保留指令。
Prefixref 基礎架構。此指令為保留指令。
Readonly 指定後面的陣列位址操作在執行時間不執行類型檢查,並且傳回可變性受限的託管指標。
Refanytype 檢索嵌入在類型化參考內的類型標記。
Refanyval 檢索嵌入在類型化參考內的位址(& 類型)。
Rem 將兩個值相除並將餘數推送到計算堆疊上。
Rem.Un 將兩個無符號值相除並將餘數推送到計算堆疊上。
Ret 從目前方法傳回,並將傳回值(如果存在)從呼叫方的計算堆疊推送到被呼叫方的計算堆疊上。
Rethrow 再次引發目前例外。
Shl 將整數值左移(用零填滿)指定的位數,並將結果推送到計算堆疊上。
Shr 將整數值右移(保留符號)指定的位數,並將結果推送到計算堆疊上。
Shr.Un 將無符號整數值右移(用零填滿)指定的位數,並將結果推送到計算堆疊上。
Sizeof 將提供的值類型的大小(以位元組為單位)推送到計算堆疊上。
Starg 將位於計算堆疊頂部的值儲存到位於指定索引的參數槽中。
Starg.S 將位於計算堆疊頂部的值儲存在參數槽中的指定索引處(短格式)。
Stelem 以計算堆疊中的值取代給定索引處的陣列元素,其類型在指令中指定。
Stelem.I 以計算堆疊上的 native int 值取代給定索引處的陣列元素。
Stelem.I1 以計算堆疊上的 int8 值取代給定索引處的陣列元素。
Stelem.I2 用計算堆疊上的 int16 值取代給定索引處的陣列元素。
Stelem.I4 用計算堆疊上的 int32 值取代給定索引處的陣列元素。
Stelem.I8 用計算堆疊上的 int64 值取代給定索引處的陣列元素。
Stelem.R4 用計算堆疊上的 float32 值取代給定索引處的陣列元素。
Stelem.R8 用計算堆疊上的 float64 值取代給定索引處的陣列元素。
Stelem.Ref 用計算堆疊上的物件 ref 值(O 類型)取代給定索引處的陣列元素。
Stfld 用新值取代在物件參考或指標的欄位中儲存的值。
Stind.I 在所提供的位址中儲存 native int 類型的值。
Stind.I1 在所提供的位址儲存 int8 類型的值。
Stind.I2 在所提供的位址儲存 int16 類型的值。
Stind.I4 在所提供的位址儲存 int32 類型的值。
Stind.I8 在所提供的位址儲存 int64 類型的值。
Stind.R4 在所提供的位址儲存 float32 類型的值。
Stind.R8 在所提供的位址儲存 float64 類型的值。
Stind.Ref 儲存所提供位址處的物件參考值。
Stloc 從計算堆疊的頂部彈出目前值並將其儲存到指定索引處的局部變數清單中。
Stloc.0 從計算堆疊的頂部彈出目前值並將其儲存到索引 0 處的局部變數清單中。
Stloc.1 從計算堆疊的頂部彈出目前值並將其儲存到索引 1 處的局部變數清單中。
Stloc.2 從計算堆疊的頂部彈出目前值並將其儲存到索引 2 處的局部變數清單中。
Stloc.3 從計算堆疊的頂部彈出目前值並將其儲存到索引 3 處的局部變數清單中。
Stloc.S 從計算堆疊的頂部彈出目前值並將其儲存在局部變數清單中的 index 處(短格式)。
Stobj 將指定類型的值從計算堆疊複製到所提供的記憶體位址。
Stsfld 用來自計算堆疊的值取代靜態欄位的值。
Sub 從其他值中減去一個值並將結果推送到計算堆疊上。
Sub.Ovf 從另一個值減去一個整數值,執行溢位檢查,並將結果推送到計算堆疊上。
Sub.Ovf.Un 從另一個值減去一個無符號整數值,執行溢位檢查,並將結果推送到計算堆疊上。
Switch 實作跳轉表。
Tailcall 執行後綴的方法呼叫指令,以便在執行實際呼叫指令之前移除目前方法的堆疊訊框。
Throw 引發目前位於計算堆疊上的例外物件。
Unaligned 指示目前位於計算堆疊上的位址可能沒有與緊接的ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或cpblk 指令的自然大小對齊。
Unbox 將值類型的已裝箱的表示形式轉換為其未裝箱的形式。
Unbox.Any 將指令中指定類型的已裝箱的表示轉換成未裝箱形式。
Volatile 指定目前位於計算堆疊頂部的位址可以是易失的,並且讀取該位置的結果不能被緩存,或者對該位址的多個儲存區不能被取消。
Xor 計算位於計算堆疊頂部的兩個值的位元異或,並將結果推送到計算堆疊上。

總結

  這篇只是給大家把IL的指令總結介紹了下,沒有詳細的去解釋。古人雲:水得一口一口喝,路得一步一步走,步子邁得大了容易扯著蛋,慢慢來.內容雖然少了點,但是還會有下篇的。下一篇還是會寫IL的一些基本指令,我會結合我自己的理解,盡量把文字寫得通俗一點,讓大家更容易理解。

以上就是.NET框架中間語言IL指令大全 的內容,更多相關內容請關注PHP中文網(www.php.cn)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板