西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)C#.NET → IL指令大全

IL指令大全

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/10/15 9:22:04字體大。A-A+

作者:西西點(diǎn)擊:566次評(píng)論:2次標(biāo)簽: IL指令

IL是.NET框架中中間語(yǔ)言(Intermediate Language)的縮寫(xiě)。使用.NET框架提供的編譯器可以直接將源程序編譯為.exe或.dll文件,但此時(shí)編譯出來(lái)的程序代碼并不是CPU能直接執(zhí)行的機(jī)器代碼,而是一種中間語(yǔ)言IL(Intermediate Language)的代碼。

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

如何讀IL(深入了解)

1.1 提出問(wèn)題
有了上面的一點(diǎn)IL基礎(chǔ)后,現(xiàn)在我們來(lái)深入一點(diǎn)點(diǎn),
有如下幾個(gè)問(wèn)題:
1 當(dāng) ldc.i4.1 這一指定加載 “i” 這個(gè)變量后并沒(méi)有馬上存入棧中,而是要執(zhí)行 stloc.0 后才被存入棧中,那沒(méi)存入棧前是存在哪里的呢?
2 ldloc.0 把元素取出來(lái)后,存在哪里的?
3 add 操作是在哪里進(jìn)行的?

1.2 概念引入
Managed Heap::這是動(dòng)態(tài)配置(Dynamic Allocation)的記憶體,由 Garbage Collector(GC)在執(zhí)行時(shí)自動(dòng)管理,整個(gè) Process 共用一個(gè)
Managed Heap(我理解為托管堆,存儲(chǔ)引用類型的值)。
Evaluation Stack:這是由 .NET CLR 在執(zhí)行時(shí)自動(dòng)管理的記憶體,每個(gè) Thread 都有自己專屬的 Evaluation Stack(我理解為類似一個(gè)臨時(shí)存放值類型數(shù)據(jù)的線程棧)
Call Stack:這是由 .NET CLR 在執(zhí)行時(shí)自動(dòng)管理的記憶體,每個(gè) Thread 都有自己專屬的 Call Stack。每呼叫一次 method,就會(huì)使得 Call Stack 上多了一個(gè) Record     Frame;呼叫完畢之後,此 Record Frame 會(huì)被丟棄(我理解為線程棧,用于存放值類型數(shù)據(jù))

1.3 IL指令詳解
對(duì)三個(gè)名詞做解釋后現(xiàn)在我們?cè)賮?lái)仔細(xì)看看執(zhí)行IL指令時(shí),對(duì)應(yīng)的變量是如何存放的

IL_0001: ldc.i4.1 //加載第一個(gè)變量i
首先對(duì) ldc.i4.1 做下細(xì)解:變量的值為1 時(shí)IL指令就是ldc.i4.1 ,變量值為2 時(shí)IL指令就是ldc.i4.2,依此類推一直到ldc.i4.8
當(dāng)為-1 時(shí)IL指令為ldc.i4.M1,當(dāng)超過(guò)8時(shí)就是一個(gè)統(tǒng)一指令 ldc.i4.S

IL_0001: ldc.i4.1 //加載第一個(gè)變量i

當(dāng)執(zhí)行這一條指令時(shí)會(huì)把變量i 的值存入Evaluation Stack中做臨時(shí)存儲(chǔ)
IL_0002: stloc.0 //把i 壓入棧中第0個(gè)位置
當(dāng)執(zhí)行這一條指信時(shí)會(huì)把Evaluation Stack 中的 i 取出存入Call Stack中的第0個(gè)位置
IL_0007: ldloc.0 //取出棧中位置為0的元素 (i)
當(dāng)執(zhí)行這條指令時(shí)會(huì)將 Call Stack中的位置為0的元素取出存入Evaluation Stack 等待做加法的指令 Add

IL_000b: add // 做加法操作
add 這一指令是在Evaluation Stack中完成的(會(huì)把需要的值從CallStack中取到Evaluation Stack中計(jì)算)

1.4 問(wèn)題回答
以上內(nèi)容看完開(kāi)始的問(wèn)題相應(yīng)也解決了
1 ldc.i4.1 把值取出來(lái)后先存在 Evaluation Stack中 執(zhí)行了stloc.0 后才會(huì)存入Call Stack中
2 ldloc.0 把取出來(lái)后也是先存在 Evaluation Stack 等持指令
3 add 操作是在 Evaluation Stack中處理的

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(2)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)