一、CIL的基本構成
CIL由CIL指令(directive)、CIL特性(attribute)、CIL操作碼(opcode)組成。
CIL指令
CIL指令是用於描述.NET程序集總體結構的標記,並且通知CIL編譯器如何定義在程序集中用到的命名空間、類、成員的。它以(.)一個點號開頭,例如:.namespace、.class、.property、.method等構成。
CIL特性
CIL特性是由於CIL指令並不能完全說明.NET成員和類的情況下,針對CIL指令進行補充說明成員或者類的特性的。比如一個類可能是公共的,集成的。它就需要用public特性、extends特性或者implements特性對類的.class指令進行修飾的補充說明。
CIL操作碼
CIL操作碼是對於類或者方法的內部邏輯進行描述和操作的代碼,例如Add(將兩個值相加並將結果推送到計算堆棧上)、Ldarg(將參數(由指定索引值引用)加載到堆棧上)Ldloc.0(將索引 0 處的局部變量加載到計算堆棧上)等其主要分爲以下五大類操作:(數據)的壓棧(ld)、彈出(st)、運算、轉移、其他、
二、CIL操作碼速記表
通過下面的速記表我們可以很容易的記憶CIL的指令:比如我們知道一個ldloc.0=ld(load)+loc(local)+.0(0位置的參數)=將索引 0 處的局部變量加載到計算堆棧上。
主要操作 | 操作數範圍/條件 | 操作數類型 | 操作數 | |||||||||
縮寫 | 全稱 | 含義 | 縮寫 | 全稱 | 含義 | 縮寫 | 全稱 | 含義 | 縮寫 | 全稱 | 含義 | |
ld | load | 將操作數壓到堆棧當中,相當於: push ax | arg | argument | 參數 | ? | ? | 操作數中的數值 | .0 | ? | 第零個參數 * | |
.1 | ? | 第一個參數 | ||||||||||
.2 | ? | 第二個參數 | ||||||||||
.3 | ? | 第三個參數 | ||||||||||
.s xx | (short) | 參數xx | ||||||||||
a | address | 操作數的地址 | 只有 .s xx,參見ldarg.s | |||||||||
loc | local | 局部變量 | 參見ldarg | |||||||||
fld | field | 字段(類的全局變量) | 參見ldarg | xx | ? | xx字段,eg: ldfld xx | ||||||
c | const | 常量 | .i4 | int 4 bytes | C#裏面的int,其他的類型例如short需要通過conv轉換 | .m1 | minus 1 | -1 | ||||
.0 | ? | 0 | ||||||||||
.1 | ? | 1 | ||||||||||
…… | ||||||||||||
.8 | 8 | |||||||||||
.s | (short) | 後面跟一個字節以內的整型數值(有符號的) | ||||||||||
? | ? | 後面跟四個字節的整型數值 | ||||||||||
.i8 | int 8 bytes | C#裏面的long | ? | ? | 後面跟八個字節的整型數值 | |||||||
.r4 | real 4 bytes | C#裏面的float | ? | ? | 後面跟四個字節的浮點數值 | |||||||
.r8 | real 8 bytes | C#裏面的double | ? | ? | 後面跟八個字節的浮點數值 | |||||||
null | null | 空值(也就是0) | ? | ? | ? | ? | ? | ? | ||||
st | store | 將堆棧內容彈出到操作數中,相當於: pop ax | 參見ld ** | |||||||||
conv | convert | 數值類型轉換,僅僅用純粹的數值類型間的轉換,例如int/float等 | ? | ? | ? | .i1 | int 1 bytes | C#裏面的sbyte | ? | ? | ? | |
.i2 | int 2 bytes | C#裏面的short | ||||||||||
.i4 | int 4 bytes | C#裏面的int | ||||||||||
.i8 | int 8 bytes | C#裏面的long | ||||||||||
.r4 | real 4 bytes | C#裏面的float | ||||||||||
.r8 | real 8 bytes | C#裏面的double | ||||||||||
.u4 | uint 4 bytes | C#裏面的uint | ||||||||||
.u8 | uint 8 bytes | C#裏面的ulong | ||||||||||
b/br | branch | 條件和無條件跳轉,相當於: jmp/jxx label_jump | br | ? | ? | 無條件跳轉 | ? | ? | ? | ? | ? | 後面跟四個字節的偏移量(有符號) |
.s | (short) | 後面跟一個字節的偏移量(有符號) | ||||||||||
false | false | 值爲零的時候跳轉 | ? | ? | ? | 參見br | ||||||
true | true | 值不爲零的時候跳轉 | ? | ? | ? | |||||||
b | eq | equal to | 相等 | ? | ? | ? | ||||||
ne | not equal to | 不相等 | un | unsigned or unordered | 無氟好的(對於整數)或者無序的(對於浮點) | |||||||
gt | greater than | 大於 | ||||||||||
lt | less than | 小於 | ||||||||||
ge | greater than or equal to | 大於等於 | ||||||||||
le | less than or equal to | 小於等於 | ||||||||||
call | call | 調用 | ? | ? | ? | ? | ? | (非虛函數) | ? |
三、CIL操作碼大全速查
通過下面的速查大全即可快速的查找CIL指令的作用。
名稱 | 說明 |
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 | 指示當前位於計算堆棧上的地址可能沒有與緊接的 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的自然大小對齊。 |
Unbox | 將值類型的已裝箱的表示形式轉換爲其未裝箱的形式。 |
Unbox.Any | 將指令中指定類型的已裝箱的表示形式轉換成未裝箱形式。 |
Volatile | 指定當前位於計算堆棧頂部的地址可以是易失的,並且讀取該位置的結果不能被緩存,或者對該地址的多個存儲區不能被取消。 |
Xor | 計算位於計算堆棧頂部的兩個值的按位異或,並且將結果推送到計算堆棧上。 |