C# ILDASM 使用

一、Microsoft Visual Studio 添加IL DASM工具


二、圖標含義


MANIFEST:是一個附加信息列表,主要包含程序集的一些屬性,如程序集名稱、版本號、哈希算法等;


.class,表示Program是一個類。並且它繼承自程序集—netstandardSystem.Object類;

1)public,表示訪問權限;
2)auto,表示程序的內存加載全部由CLR來控制;

3)ansi,是爲了在沒有託管代碼與託管代碼之間實現無縫轉換。這裏主要指C、C++代碼等;

4)beforefieldinit,是用來標記運行庫(CLR)可以在靜態字段方法生成後的任意時刻,來加載構造器(構造函數);


.ctor 方法代碼:

1)cil managed:表示其中爲IL代碼,指示編譯器編譯爲託管代碼;
2).maxstack:表示調用構造函數.otor期間的評估堆棧(Evaluation Stack) ;
3)  IL_0000:標記代碼行開頭;
4)ldarg.0:表示轉載第一個成員參數,在實例方法中指的是當前實例的引用;
5)call:call一般用於調用靜態方法,因爲靜態方法是在編譯期就確定的。而這裏的構造函數.otor()也是在編譯期就制定的。而另一指令callvirt則表示調用實例方法, 它是在運行時確定的,因爲如前述,當調用方法的繼承關係時,就要比較基類與派生類的同名函數的實現方法(virtual和new),以確定調用的函數所屬的Method Table;
6)ret:表示執行完畢,返回;



1)hidebysig:表示當把此類作爲基類,存在派生類時,此方法不被繼承,同上構造函數;
2).entrypoint:指令表示CLR加載程序時,是首先從.entrypoint開始的,即從Main方法作爲程序的入口函數;


三、IL DASM詳細指令

名稱

說明

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 類型)的地址。

Div

將兩個值相除並將結果作爲浮點(F 類型)或商(int32 類型)推送到計算堆棧上。

Div.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

指示當前位於計算堆棧上的地址可能沒有與緊接的 ldindstindldfldstfldldobjstobjinitblk cpblk 指令的自然大小對齊。

Unbox

將值類型的已裝箱的表示形式轉換爲其未裝箱的形式。

Unbox.Any

將指令中指定類型的已裝箱的表示形式轉換成未裝箱形式。

Volatile

指定當前位於計算堆棧頂部的地址可以是易失的,並且讀取該位置的結果不能被緩存,或者對該地址的多個存儲區不能被取消。

Xor

計算位於計算堆棧頂部的兩個值的按位異或,並且將結果推送到計算堆棧上。




發佈了62 篇原創文章 · 獲贊 129 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章