溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

發(fā)布時間:2020-07-21 23:31:18 來源:網(wǎng)絡(luò) 閱讀:1000 作者:liulang5500 欄目:編程語言

本文記錄我使用.net reflector和VS自帶反編譯和編譯功能實現(xiàn)丟失代碼程序的簡單修改。工作中可能會碰到源碼丟失但還要更改程序的情況,或是你想要破解某個軟件,這就需要反編譯

名詞

    IL指令:IL文件中的語法命令,IL(Intermadiate Language)是.net框架中的中間語言。編譯器編譯成的exe或dll文件并不是CPU能識別的機器語言,而是IL代碼

    .NET Reflector:第三方.NET程序的反編譯工具

    ILDASM,ILASM:微軟強大的VS命令提示中的反編譯和編譯命令

內(nèi)部實現(xiàn)簡介-引用自網(wǎng)絡(luò),作者不詳,在此表示感謝

    .NET CLR和JAVA VM都是堆疊式虛擬機(Stack-Based VM),他們的指令集(Instruction Set)都是采用堆疊運算的方式,執(zhí)行的時候資料都是放在堆疊中,再進行運算。JAVA VM約有200個指令,每個指令都是有1byte的操作碼(opcode),后面接不等數(shù)目的參數(shù),.NET CLR約有超過220個指令,有些指令使用相同的opcode,所以opcode的數(shù)據(jù)比指令略少,opcode的長度不固定,大部分是1byte,有些是2byte

簡單實例

ILtest.exe

IL指令初識和.NET Reflector&&ILDASM,ILASM使用IL指令初識和.NET Reflector&&ILDASM,ILASM使用

簡單的加法運算,分別兩個按鈕實現(xiàn)求和、求和后再加100

代碼

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

Reflector中打開ILtest.exe

IL指令初識和.NET Reflector&&ILDASM,ILASM使用ILtest的全局成員、字段、方法,代碼顯示非常詳盡

ildasm、ilasm:VS開發(fā)人員命令提示中輸入ildasm,并打開EXE文件

IL指令初識和.NET Reflector&&ILDASM,ILASM使用ildasm中圖標(biāo)含義,圖片來自網(wǎng)絡(luò)

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

轉(zhuǎn)儲到il文件

勾選轉(zhuǎn)儲IL代碼,源行可選也可不選,選擇后會有注釋的源代碼,方便對應(yīng)指令,展開try/catch會帶有try/catch塊,方便程式閱讀

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

ILtest.il修改前,button2.Text 和字符串常量 num

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

ILtest.il中修改button2.Text初始值和常量字符串num的值

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

使用ilasm重新編譯

開發(fā)人員命令提示中輸入:

ilasm :\taskDemo\ILtest\ILtest\bin\Debug\ILtest.il /output=D:\taskDemo\ILtest\ILtest\bin\Debug\ILtestCompile.exe /exe

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

Operation completed successfully

IL指令初識和.NET Reflector&&ILDASM,ILASM使用

執(zhí)行ILtestCompile.exe

button2.Text變成+200計 算,計算結(jié)果227,執(zhí)行成功

IL指令初識和.NET Reflector&&ILDASM,ILASM使用IL指令初識和.NET Reflector&&ILDASM,ILASM使用

擴展補充

對于DLL同樣可以實現(xiàn)反編譯修改后重新編譯

il文件程式執(zhí)行時關(guān)鍵的記憶體有三種:參考 http://www.jb51.net/article/39635.htm 在此感謝作者!

1、Managed Heap:這是動態(tài)配置(Dynamic Allocation)的記憶體,由 Garbage Collector(GC)在執(zhí)行時自動管理,整個Process 共用一個 Managed Heap。

2、Call Stack:這是由 .NET CLR 在執(zhí)行時自動管理的記憶體,每個 Thread 都有自己專屬的 Call Stack。每呼叫一次 method,就會使得Call Stack 上多了一個 Record Frame;呼叫完畢之后,此 Record Frame 會被丟棄。一般來說,Record Frame 內(nèi)記錄著 method 參數(shù)(Parameter)、返回位址(Return Address)、以及區(qū)域變數(shù)(Local Variable)。Java VM 和 .NET CLR 都是使用 0, 1, 2… 編號的方式來識別區(qū)別變數(shù)。

3、Evaluation Stack:這是由 .NET CLR 在執(zhí)行時自動管理的記憶體,每個 Thread 都有自己專屬的 Evaluation Stack。前面所謂的堆疊式虛擬機器,指的就是這個堆疊。

il指令

感謝 chaojiak47 整理

名稱                                說明          
Add        將兩個值相加并將結(jié)果推送到計算堆棧上。          
Add.Ovf        將兩個整數(shù)相加,執(zhí)行溢出檢查,并且將結(jié)果推送到計算堆棧上。          
Add.Ovf.Un        將兩個無符號整數(shù)值相加,執(zhí)行溢出檢查,并且將結(jié)果推送到計算堆棧上。          
And        計算兩個值的按位“與”并將結(jié)果推送到計算堆棧上。          
Arglist        返回指向當(dāng)前方法的參數(shù)列表的非托管指針。          
Beq        如果兩個值相等,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Beq.S        如果兩個值相等,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Bge        如果第一個值大于或等于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Bge.S        如果第一個值大于或等于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Bge.Un        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值大于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Bge.Un.S        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值大于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Bgt        如果第一個值大于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Bgt.S        如果第一個值大于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Bgt.Un        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值大于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Bgt.Un.S        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值大于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Ble        如果第一個值小于或等于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Ble.S        如果第一個值小于或等于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Ble.Un        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值小于或等于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Ble.Un.S        當(dāng)比較無符號整數(shù)值或不可排序的浮點值時,如果第一個值小于或等于第二個值,則將控制權(quán)轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Blt        如果第一個值小于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Blt.S        如果第一個值小于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Blt.Un        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值小于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Blt.Un.S        當(dāng)比較無符號整數(shù)值或不可排序的浮點型值時,如果第一個值小于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Bne.Un        當(dāng)兩個無符號整數(shù)值或不可排序的浮點型值不相等時,將控制轉(zhuǎn)移到目標(biāo)指令。          
Bne.Un.S        當(dāng)兩個無符號整數(shù)值或不可排序的浮點型值不相等時,將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Box        將值類轉(zhuǎn)換為對象引用(O 類型)。          
Br        無條件地將控制轉(zhuǎn)移到目標(biāo)指令。          
Br.S        無條件地將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Break        向公共語言結(jié)構(gòu) (CLI) 發(fā)出信號以通知調(diào)試器已撞上了一個斷點。          
Brfalse        如果 value 為 false、空引用(Visual Basic 中的 Nothing)或零,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Brfalse.S        如果 value 為 false、空引用或零,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Brtrue        如果 value 為 true、非空或非零,則將控制轉(zhuǎn)移到目標(biāo)指令。          
Brtrue.S        如果 value 為 true、非空或非零,則將控制轉(zhuǎn)移到目標(biāo)指令(短格式)。          
Call        調(diào)用由傳遞的方法說明符指示的方法。          
Calli        通過調(diào)用約定描述的參數(shù)調(diào)用在計算堆棧上指示的方法(作為指向入口點的指針)。          
Callvirt        對對象調(diào)用后期綁定方法,并且將返回值推送到計算堆棧上。          
Castclass        嘗試將引用傳遞的對象轉(zhuǎn)換為指定的類。          
Ceq        比較兩個值。如果這兩個值相等,則將整數(shù)值 1 (int32) 推送到計算堆棧上;否則,將 0 (int32) 推送到計算堆棧上。          
Cgt        比較兩個值。如果第一個值大于第二個值,則將整數(shù)值 1 (int32) 推送到計算堆棧上;反之,將 0 (int32) 推送到計算堆棧上。          
Cgt.Un        比較兩個無符號的或不可排序的值。如果第一個值大于第二個值,則將整數(shù)值 1 (int32) 推送到計算堆棧上;反之,將 0 (int32) 推送到計算堆棧上。          
Ckfinite        如果值不是有限數(shù),則引發(fā) ArithmeticException。          
Clt        比較兩個值。如果第一個值小于第二個值,則將整數(shù)值 1 (int32) 推送到計算堆棧上;反之,將 0 (int32) 推送到計算堆棧上。          
Clt.Un        比較無符號的或不可排序的值 value1 和 value2。如果 value1 小于 value2,則將整數(shù)值 1 (int32 ) 推送到計算堆棧上;反之,將 0 ( int32 ) 推送到計算堆棧上。          
Constrained        約束要對其進行虛方法調(diào)用的類型。          
Conv.I        將位于計算堆棧頂部的值轉(zhuǎn)換為 native int。          
Conv.I1        將位于計算堆棧頂部的值轉(zhuǎn)換為 int8,然后將其擴展(填充)為 int32。          
Conv.I2        將位于計算堆棧頂部的值轉(zhuǎn)換為 int16,然后將其擴展(填充)為 int32。          
Conv.I4        將位于計算堆棧頂部的值轉(zhuǎn)換為 int32。          
Conv.I8        將位于計算堆棧頂部的值轉(zhuǎn)換為 int64。          
Conv.Ovf.I        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為有符號 native int,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為有符號 native int,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I1        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為有符號 int8 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I1.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為有符號 int8 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I2        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為有符號 int16 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I2.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為有符號 int16 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I4        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為有符號 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I4.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為有符號 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I8        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為有符號 int64,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.I8.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為有符號 int64,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為 unsigned native int,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為 unsigned native int,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U1        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為 unsigned int8 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U1.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為 unsigned int8 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U2        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為 unsigned int16 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U2.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為 unsigned int16 并將其擴展為 int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U4        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為 unsigned int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U4.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為 unsigned int32,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U8        將位于計算堆棧頂部的有符號值轉(zhuǎn)換為 unsigned int64,并在溢出時引發(fā) OverflowException。          
Conv.Ovf.U8.Un        將位于計算堆棧頂部的無符號值轉(zhuǎn)換為 unsigned int64,并在溢出時引發(fā) OverflowException。          
Conv.R.Un        將位于計算堆棧頂部的無符號整數(shù)值轉(zhuǎn)換為 float32。          
Conv.R4        將位于計算堆棧頂部的值轉(zhuǎn)換為 float32。          
Conv.R8        將位于計算堆棧頂部的值轉(zhuǎn)換為 float64。          
Conv.U        將位于計算堆棧頂部的值轉(zhuǎn)換為 unsigned native int,然后將其擴展為 native int。          
Conv.U1        將位于計算堆棧頂部的值轉(zhuǎn)換為 unsigned int8,然后將其擴展為 int32。          
Conv.U2        將位于計算堆棧頂部的值轉(zhuǎn)換為 unsigned int16,然后將其擴展為 int32。          
Conv.U4        將位于計算堆棧頂部的值轉(zhuǎn)換為 unsigned int32,然后將其擴展為 int32。          
Conv.U8        將位于計算堆棧頂部的值轉(zhuǎn)換為 unsigned int64,然后將其擴展為 int64。          
Cpblk        將指定數(shù)目的字節(jié)從源地址復(fù)制到目標(biāo)地址。          
Cpobj        將位于對象(&、* 或 native int 類型)地址的值類型復(fù)制到目標(biāo)對象(&、* 或 native int 類型)的地址。          
Div        將兩個值相除并將結(jié)果作為浮點(F 類型)或商(int32 類型)推送到計算堆棧上。          
Div.Un        兩個無符號整數(shù)值相除并將結(jié)果 ( int32 ) 推送到計算堆棧上。          
Dup        復(fù)制計算堆棧上當(dāng)前最頂端的值,然后將副本推送到計算堆棧上。          
Endfilter        將控制從異常的 filter 子句轉(zhuǎn)移回公共語言結(jié)構(gòu) (CLI) 異常處理程序。          
Endfinally        將控制從異常塊的 fault 或 finally 子句轉(zhuǎn)移回公共語言結(jié)構(gòu) (CLI) 異常處理程序。          
Initblk        將位于特定地址的內(nèi)存的指定塊初始化為給定大小和初始值。          
Initobj        將位于指定地址的值類型的每個字段初始化為空引用或適當(dāng)?shù)幕愋偷?0。          
Isinst        測試對象引用(O 類型)是否為特定類的實例。          
Jmp        退出當(dāng)前方法并跳至指定方法。          
Ldarg        將參數(shù)(由指定索引值引用)加載到堆棧上。          
Ldarg.0        將索引為 0 的參數(shù)加載到計算堆棧上。          
Ldarg.1        將索引為 1 的參數(shù)加載到計算堆棧上。          
Ldarg.2        將索引為 2 的參數(shù)加載到計算堆棧上。          
Ldarg.3        將索引為 3 的參數(shù)加載到計算堆棧上。          
Ldarg.S        將參數(shù)(由指定的短格式索引引用)加載到計算堆棧上。          
Ldarga        將參數(shù)地址加載到計算堆棧上。          
Ldarga.S        以短格式將參數(shù)地址加載到計算堆棧上。          
Ldc.I4        將所提供的 int32 類型的值作為 int32 推送到計算堆棧上。          
Ldc.I4.0        將整數(shù)值 0 作為 int32 推送到計算堆棧上。          
Ldc.I4.1        將整數(shù)值 1 作為 int32 推送到計算堆棧上。          
Ldc.I4.2        將整數(shù)值 2 作為 int32 推送到計算堆棧上。          
Ldc.I4.3        將整數(shù)值 3 作為 int32 推送到計算堆棧上。          
Ldc.I4.4        將整數(shù)值 4 作為 int32 推送到計算堆棧上。          
Ldc.I4.5        將整數(shù)值 5 作為 int32 推送到計算堆棧上。          
Ldc.I4.6        將整數(shù)值 6 作為 int32 推送到計算堆棧上。          
Ldc.I4.7        將整數(shù)值 7 作為 int32 推送到計算堆棧上。          
Ldc.I4.8        將整數(shù)值 8 作為 int32 推送到計算堆棧上。          
Ldc.I4.M1        將整數(shù)值 -1 作為 int32 推送到計算堆棧上。          
Ldc.I4.S        將提供的 int8 值作為 int32 推送到計算堆棧上(短格式)。          
Ldc.I8        將所提供的 int64 類型的值作為 int64 推送到計算堆棧上。          
Ldc.R4        將所提供的 float32 類型的值作為 F (float) 類型推送到計算堆棧上。          
Ldc.R8        將所提供的 float64 類型的值作為 F (float) 類型推送到計算堆棧上。          
Ldelem        按照指令中指定的類型,將指定數(shù)組索引中的元素加載到計算堆棧的頂部。          
Ldelem.I        將位于指定數(shù)組索引處的 native int 類型的元素作為 native int 加載到計算堆棧的頂部。          
Ldelem.I1        將位于指定數(shù)組索引處的 int8 類型的元素作為 int32 加載到計算堆棧的頂部。          
Ldelem.I2        將位于指定數(shù)組索引處的 int16 類型的元素作為 int32 加載到計算堆棧的頂部。          
Ldelem.I4        將位于指定數(shù)組索引處的 int32 類型的元素作為 int32 加載到計算堆棧的頂部。          
Ldelem.I8        將位于指定數(shù)組索引處的 int64 類型的元素作為 int64 加載到計算堆棧的頂部。          
Ldelem.R4        將位于指定數(shù)組索引處的 float32 類型的元素作為 F 類型(浮點型)加載到計算堆棧的頂部。          
Ldelem.R8        將位于指定數(shù)組索引處的 float64 類型的元素作為 F 類型(浮點型)加載到計算堆棧的頂部。          
Ldelem.Ref        將位于指定數(shù)組索引處的包含對象引用的元素作為 O 類型(對象引用)加載到計算堆棧的頂部。          
Ldelem.U1        將位于指定數(shù)組索引處的 unsigned int8 類型的元素作為 int32 加載到計算堆棧的頂部。          
Ldelem.U2        將位于指定數(shù)組索引處的 unsigned int16 類型的元素作為 int32 加載到計算堆棧的頂部。          
Ldelem.U4        將位于指定數(shù)組索引處的 unsigned int32 類型的元素作為 int32 加載到計算堆棧的頂部。          
Ldelema        將位于指定數(shù)組索引的數(shù)組元素的地址作為 & 類型(托管指針)加載到計算堆棧的頂部。          
Ldfld        查找對象中其引用當(dāng)前位于計算堆棧的字段的值。          
Ldflda        查找對象中其引用當(dāng)前位于計算堆棧的字段的地址。          
Ldftn        將指向?qū)崿F(xiàn)特定方法的本機代碼的非托管指針(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        將從零開始的、一維數(shù)組的元素的數(shù)目推送到計算堆棧上。          
Ldloc        將指定索引處的局部變量加載到計算堆棧上。          
Ldloc.0        將索引 0 處的局部變量加載到計算堆棧上。          
Ldloc.1        將索引 1 處的局部變量加載到計算堆棧上。          
Ldloc.2        將索引 2 處的局部變量加載到計算堆棧上。          
Ldloc.3        將索引 3 處的局部變量加載到計算堆棧上。          
Ldloc.S        將特定索引處的局部變量加載到計算堆棧上(短格式)。          
Ldloca        將位于特定索引處的局部變量的地址加載到計算堆棧上。          
Ldloca.S        將位于特定索引處的局部變量的地址加載到計算堆棧上(短格式)。          
Ldnull        將空引用(O 類型)推送到計算堆棧上。          
Ldobj        將地址指向的值類型對象復(fù)制到計算堆棧的頂部。          
Ldsfld        將靜態(tài)字段的值推送到計算堆棧上。          
Ldsflda        將靜態(tài)字段的地址推送到計算堆棧上。          
Ldstr        推送對元數(shù)據(jù)中存儲的字符串的新對象引用。          
Ldtoken        將元數(shù)據(jù)標(biāo)記轉(zhuǎn)換為其運行時表示形式,并將其推送到計算堆棧上。          
Ldvirtftn        將指向?qū)崿F(xiàn)與指定對象關(guān)聯(lián)的特定虛方法的本機代碼的非托管指針(native int 類型)推送到計算堆棧上。          
Leave        退出受保護的代碼區(qū)域,無條件將控制轉(zhuǎn)移到特定目標(biāo)指令。          
Leave.S        退出受保護的代碼區(qū)域,無條件將控制轉(zhuǎn)移到目標(biāo)指令(縮寫形式)。          
Localloc        從本地動態(tài)內(nèi)存池分配特定數(shù)目的字節(jié)并將第一個分配的字節(jié)的地址(瞬態(tài)指針,* 類型)推送到計算堆棧上。          
Mkrefany        將對特定類型實例的類型化引用推送到計算堆棧上。          
Mul        將兩個值相乘并將結(jié)果推送到計算堆棧上。          
Mul.Ovf        將兩個整數(shù)值相乘,執(zhí)行溢出檢查,并將結(jié)果推送到計算堆棧上。          
Mul.Ovf.Un        將兩個無符號整數(shù)值相乘,執(zhí)行溢出檢查,并將結(jié)果推送到計算堆棧上。          
Neg        對一個值執(zhí)行求反并將結(jié)果推送到計算堆棧上。          
Newarr        將對新的從零開始的一維數(shù)組(其元素屬于特定類型)的對象引用推送到計算堆棧上。          
Newobj        創(chuàng)建一個值類型的新對象或新實例,并將對象引用(O 類型)推送到計算堆棧上。          
Nop        如果修補操作碼,則填充空間。盡管可能消耗處理周期,但未執(zhí)行任何有意義的操作。          
Not        計算堆棧頂部整數(shù)值的按位求補并將結(jié)果作為相同的類型推送到計算堆棧上。          
Or        計算位于堆棧頂部的兩個整數(shù)值的按位求補并將結(jié)果推送到計算堆棧上。          
Pop        移除當(dāng)前位于計算堆棧頂部的值。          
Prefix1        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefix2        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefix3        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefix4        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefix5        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefix6        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefix7        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Prefixref        基礎(chǔ)結(jié)構(gòu)。此指令為保留指令。          
Readonly        指定后面的數(shù)組地址操作在運行時不執(zhí)行類型檢查,并且返回可變性受限的托管指針。          
Refanytype        檢索嵌入在類型化引用內(nèi)的類型標(biāo)記。          
Refanyval        檢索嵌入在類型化引用內(nèi)的地址(& 類型)。          
Rem        將兩個值相除并將余數(shù)推送到計算堆棧上。          
Rem.Un        將兩個無符號值相除并將余數(shù)推送到計算堆棧上。          
Ret        從當(dāng)前方法返回,并將返回值(如果存在)從調(diào)用方的計算堆棧推送到被調(diào)用方的計算堆棧上。          
Rethrow        再次引發(fā)當(dāng)前異常。          
Shl        將整數(shù)值左移(用零填充)指定的位數(shù),并將結(jié)果推送到計算堆棧上。          
Shr        將整數(shù)值右移(保留符號)指定的位數(shù),并將結(jié)果推送到計算堆棧上。          
Shr.Un        將無符號整數(shù)值右移(用零填充)指定的位數(shù),并將結(jié)果推送到計算堆棧上。          
Sizeof        將提供的值類型的大?。ㄒ宰止?jié)為單位)推送到計算堆棧上。          
Starg        將位于計算堆棧頂部的值存儲到位于指定索引的參數(shù)槽中。          
Starg.S        將位于計算堆棧頂部的值存儲在參數(shù)槽中的指定索引處(短格式)。          
Stelem        用計算堆棧中的值替換給定索引處的數(shù)組元素,其類型在指令中指定。          
Stelem.I        用計算堆棧上的 native int 值替換給定索引處的數(shù)組元素。          
Stelem.I1        用計算堆棧上的 int8 值替換給定索引處的數(shù)組元素。          
Stelem.I2        用計算堆棧上的 int16 值替換給定索引處的數(shù)組元素。          
Stelem.I4        用計算堆棧上的 int32 值替換給定索引處的數(shù)組元素。          
Stelem.I8        用計算堆棧上的 int64 值替換給定索引處的數(shù)組元素。          
Stelem.R4        用計算堆棧上的 float32 值替換給定索引處的數(shù)組元素。          
Stelem.R8        用計算堆棧上的 float64 值替換給定索引處的數(shù)組元素。          
Stelem.Ref        用計算堆棧上的對象 ref 值(O 類型)替換給定索引處的數(shù)組元素。          
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        從計算堆棧的頂部彈出當(dāng)前值并將其存儲到指定索引處的局部變量列表中。          
Stloc.0        從計算堆棧的頂部彈出當(dāng)前值并將其存儲到索引 0 處的局部變量列表中。          
Stloc.1        從計算堆棧的頂部彈出當(dāng)前值并將其存儲到索引 1 處的局部變量列表中。          
Stloc.2        從計算堆棧的頂部彈出當(dāng)前值并將其存儲到索引 2 處的局部變量列表中。          
Stloc.3        從計算堆棧的頂部彈出當(dāng)前值并將其存儲到索引 3 處的局部變量列表中。          
Stloc.S        從計算堆棧的頂部彈出當(dāng)前值并將其存儲在局部變量列表中的 index 處(短格式)。          
Stobj        將指定類型的值從計算堆棧復(fù)制到所提供的內(nèi)存地址中。          
Stsfld        用來自計算堆棧的值替換靜態(tài)字段的值。          
Sub        從其他值中減去一個值并將結(jié)果推送到計算堆棧上。          
Sub.Ovf        從另一值中減去一個整數(shù)值,執(zhí)行溢出檢查,并且將結(jié)果推送到計算堆棧上。          
Sub.Ovf.Un        從另一值中減去一個無符號整數(shù)值,執(zhí)行溢出檢查,并且將結(jié)果推送到計算堆棧上。          
Switch        實現(xiàn)跳轉(zhuǎn)表。          
Tailcall        執(zhí)行后綴的方法調(diào)用指令,以便在執(zhí)行實際調(diào)用指令前移除當(dāng)前方法的堆棧幀。          
Throw        引發(fā)當(dāng)前位于計算堆棧上的異常對象。          
Unaligned        指示當(dāng)前位于計算堆棧上的地址可能沒有與緊接的 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的自然大小對齊。          
Unbox        將值類型的已裝箱的表示形式轉(zhuǎn)換為其未裝箱的形式。          
Unbox.Any        將指令中指定類型的已裝箱的表示形式轉(zhuǎn)換成未裝箱形式。          
Volatile        指定當(dāng)前位于計算堆棧頂部的地址可以是易失的,并且讀取該位置的結(jié)果不能被緩存,或者對該地址的多個存儲區(qū)不能被取消。          
Xor        計算位于計算堆棧頂部的兩個值的按位異或,并且將結(jié)果推送到計算堆棧上。


向AI問一下細(xì)節(jié)
推薦閱讀:
  1. 初識 prometheus
  2. 初識Redis

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI