标号和流程控制指令 | ||||
直接跳转指令 | 无条件跳转 | Br | 无条件地将控制转移到目标指令 | |
Br.s | 无条件地将控制转移到目标指令(短格式)。 | |||
有条件跳转 | BrFalse | 如果 value 为 false、空引用或零,则将控制转移到目标指令。 | ||
Brfalse.s | 如果 value 为 false、空引用或零,则将控制转移到目标指令 | |||
Brtrue | 如果 value 为 true、非空或非零,则将控制转移到目标指令 | |||
Brtrue.s | 如果 value 为 true、非空或非零,则将控制转移到目标指令(短格式) | |||
比较跳转指令 | 等于 | Beq | 如果两个值相等,则将控制转移到目标指令。 | |
Beq.s | 如果两个值相等,则将控制转移到目标指令(短格式) | |||
不等于 | Bne.un | 当两个无符号整数值或未经排序的浮点值不相等时,将控制转移到目标指令 | ||
bne.un.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 | 当比较无符号整数值或未经排序的浮点值时,如果第一个值小于第二个值,则将控制转移到目标指令(短格式) | |||
其他跳转指令 | break指令 | Break | 向公共语言结构 (CLI) 发出信号以通知调试器已撞上了一个断点 | |
托管EH块退出指令 | leave | 退出受保护的代码区域,无条件将控制转移到特定目标指令 | ||
leave.s | 退出受保护的代码区域,无条件将控制转移到目标指令(缩写形式) | |||
托管EH块结束指令 | endfilter | 将控制从异常的 filter 子句转移回公共语言结构 (CLI) 异常处理程序 | ||
endfinally | 将控制从异常块的 fault 或 finally 子句转移回公共语言结构 (CLI) 异常处理程序 | |||
ret指令 | ret | 从当前方法返回,并将返回值(如果存在)从被调用方的计算堆栈推送到调用方的计算堆栈上。 | ||
运算指令 | ||||
栈处理指令 | nop | 如果修补操作码,则填充空间。 尽管可能消耗处理周期,但未执行任何有意义的操作 | ||
dup | 复制计算堆栈上当前最顶端的值,然后将副本推送到计算堆栈上 | |||
pop | 移除当前位于计算堆栈顶部的值 | |||
常量加载 | ldc.i4 | 将所提供的 int32 类型的值作为 int32 推送到计算堆栈上 | ||
ldc.i4.s | 将提供的 int8 值作为 int32 推送到计算堆栈上(短格式) | |||
ldc.i8 | 将所提供的 int64 类型的值作为 int64 推送到计算堆栈上 | |||
ldc.r4 | 将所提供的 float32 类型的值作为 F (float) 类型推送到计算堆栈上 | |||
ldc.r8 | 将所提供的 float64 类型的值作为 F (float) 类型推送到计算堆栈上 | |||
ldc.i4.m1 | 将整数值 -1 作为 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 推送到计算堆栈上 | |||
间接加载 | ldind.i | 将 native int 类型的值作为 native int 间接加载到计算堆栈上 | ||
ldind.r4 | 将 float32 类型的值作为 F (float) 类型间接加载到计算堆栈上 | |||
ldind.r8 | 将 float64 类型的值作为 F (float) 类型间接加载到计算堆栈上 | |||
ldind.ref | 将对象引用作为 O(对象引用)类型间接加载到计算堆栈上 | |||
ldind.i1 | 将 int8 类型的值作为 int32 间接加载到计算堆栈上 | |||
ldind.i2 | 将 int16 类型的值作为 int32 间接加载到计算堆栈上 | |||
ldind.i4 | 将 int32 类型的值作为 int32 间接加载到计算堆栈上 | |||
ldind.i8(ldind.u8) | 将 int64 类型的值作为 int64 间接加载到计算堆栈上 | |||
ldind.u1 | 将 unsigned int8 类型的值作为 int32 间接加载到计算堆栈上 | |||
ldind.u2 | 将 unsigned int16 类型的值作为 int32 间接加载到计算堆栈上 | |||
ldind.u4 | 将 unsigned int32 类型的值作为 int32 间接加载到计算堆栈上 | |||
间接存储 | stind.i | 在所提供的地址存储 native int 类型的值 | ||
stind.r4 | 在所提供的地址存储 float32 类型的值 | |||
stind.r8 | 在所提供的地址存储 float64 类型的值 | |||
stind.ref | 存储所提供地址处的对象引用值 | |||
stind.i1 | 在所提供的地址存储 int8 类型的值 | |||
stind.i2 | 在所提供的地址存储 int16 类型的值 | |||
stind.i4 | 在所提供的地址存储 int32 类型的值 | |||
stind.i8 | 在所提供的地址存储 int64 类型的值 | |||
算术操作 | add | 将两个值相加并将结果推送到计算堆栈上 | ||
sub | 从其他值中减去一个值并将结果推送到计算堆栈上 | |||
mul | 将两个值相乘并将结果推送到计算堆栈上。 | |||
div | 将两个值相除并将结果作为浮点(F 类型)或商(int32 类型)推送到计算堆栈上 | |||
div.un | 两个无符号整数值相除并将结果 ( int32 ) 推送到计算堆栈上 | |||
Rem | 将两个值相除并将余数推送到计算堆栈上 | |||
rem.un | 将两个无符号值相除并将余数推送到计算堆栈上 | |||
neg | 对一个值执行求反并将结果推送到计算堆栈上 | |||
算术溢出操作 | add.ovf | 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上 | ||
add.ovf.un | 将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上 | |||
sub.ovf | 从另一值中减去一个整数值,执行溢出检查,并且将结果推送到计算堆栈上 | |||
sub.ovf.un | 从另一值中减去一个无符号整数值,执行溢出检查,并且将结果推送到计算堆栈上 | |||
mul.ovf | 将两个整数值相乘,执行溢出检查,并将结果推送到计算堆栈上 | |||
mul.ovf.un | 将两个无符号整数值相乘,执行溢出检查,并将结果推送到计算堆栈上 | |||
位运算符操作 | 位操作 | and | 计算两个值的按位“与”并将结果推送到计算堆栈上 | |
or | 计算位于堆栈顶部的两个整数值的按位求补并将结果推送到计算堆栈 | |||
xor | 计算位于计算堆栈顶部的两个值的按位异或,并且将结果推送到计算堆栈上 | |||
not | 计算堆栈顶部整数值的按位求补并将结果作为相同的类型推送到计算堆栈上 | |||
移位操作 | shl | 将整数值左移(用零填充)指定的位数,并将结果推送到计算堆栈上 | ||
shr | 将整数值右移(保留符号)指定的位数,并将结果推送到计算堆栈上 | |||
shr.un | 将无符号整数值右移(用零填充)指定的位数,并将结果推送到计算堆栈上 | |||
转换操作 | conv.i | 将位于计算堆栈顶部的值转换为 native int。 | ||
conv.u | 将位于计算堆栈顶部的值转换为 unsigned native int,然后将其扩展为 native int | |||
conv.r4 | 将位于计算堆栈顶部的值转换为 float32 | |||
conv.r8 | 将位于计算堆栈顶部的值转换为 float64。 | |||
conv.r.un | 将位于计算堆栈顶部的无符号整数值转换为 float32。 | |||
conv.i1 | 将位于计算堆栈顶部的值转换为 int8,然后将其扩展(填充)为 int32。 | |||
conv.i2 | 将位于计算堆栈顶部的值转换为 int16,然后将其扩展(填充)为 int32。 | |||
conv.i4 | 将位于计算堆栈顶部的值转换为 int32。 | |||
conv.i8 | 将位于计算堆栈顶部的值转换为 int64。 | |||
conv.u1 | 将位于计算堆栈顶部的值转换为 unsigned int8,然后将其扩展为 int32。 | |||
conv.u2 | 将位于计算堆栈顶部的值转换为 unsigned int16,然后将其扩展为 int32。 | |||
conv.u4 | 将位于计算堆栈顶部的值转换为 unsigned int32,然后将其扩展为 int32 | |||
conv.u8 | 将位于计算堆栈顶部的值转换为 unsigned int64,然后将其扩展为 int64 | |||
转换溢出操作 | conv.ovf.i | 将位于计算堆栈顶部的有符号值转换为有符号 native int,并在溢出时引发 OverflowException | ||
conv.ovf.u | 将位于计算堆栈顶部的无符号值转换为有符号 native int,并在溢出时引发 OverflowException | |||
conv.ovf.i.un | 将位于计算堆栈顶部的有符号值转换为 unsigned native int,并在溢出时引发 OverflowException | |||
conv.ovf.u.un | 将位于计算堆栈顶部的无符号值转换为 unsigned native int,并在溢出时引发 OverflowException。 | |||
conv.ovf.i1 | 将位于计算堆栈顶部的有符号值转换为有符号的 int8 并将其扩展为 int32,并在溢出时引发 OverflowException | |||
conv.ovf.u1 | 将位于计算堆栈顶部的有符号值转换为 unsigned int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 | |||
conv.ovf.i1.un | 将位于计算堆栈顶部的无符号值转换为有符号 int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 | |||
conv.ovf.u1.un | 将位于计算堆栈顶部的无符号值转换为 unsigned int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 | |||
conv.ovf.i2 | 将位于计算堆栈顶部的有符号值转换为有符号 int16 并将其扩展为 int32,并在溢出时引发 OverflowException | |||
conv.ovf.u2 | 将位于计算堆栈顶部的有符号值转换为 unsigned int16 并将其扩展为 int32,并在溢出时引发 OverflowException | |||
conv.ovf.i2.un | 将位于计算堆栈顶部的无符号值转换为有符号 int16 并将其扩展为 int32,并在溢出时引发 OverflowException | |||
conv.ovf.u2.un | 将位于计算堆栈顶部的无符号值转换为 unsigned int16 并将其扩展为 int32,并在溢出时引发 OverflowException | |||
conv.ovf.i4 | 将位于计算堆栈顶部的有符号值转换为有符号 int32,并在溢出时引发 OverflowException | |||
conv.ovf.u4 | 将位于计算堆栈顶部的有符号值转换为 unsigned int32,并在溢出时引发 OverflowException。 | |||
conv.ovf.i4.un | 将位于计算堆栈顶部的无符号值转换为有符号 int32,并在溢出时引发 OverflowException。 | |||
conv.ovf.u4.un | 将位于计算堆栈顶部的无符号值转换为 unsigned int32,并在溢出时引发 OverflowException。 | |||
conv.ovf.i8 | 将位于计算堆栈顶部的有符号值转换为有符号 int64,并在溢出时引发 OverflowException。 | |||
conv.ovf.u8 | 将位于计算堆栈顶部的有符号值转换为 unsigned int64,并在溢出时引发 OverflowException | |||
conv.ovf.i8.un | 将位于计算堆栈顶部的无符号值转换为有符号 int64,并在溢出时引发 OverflowException | |||
conv.ovf.u8.un | 将位于计算堆栈顶部的无符号值转换为 unsigned int64,并在溢出时引发 OverflowException。 | |||
逻辑条件指令 | ceq | 比较两个值。 如果这两个值相等,则将整数值 1 (int32) 推送到计算堆栈上;否则,将 0 (int32) 推送到计算堆栈上 | ||
cgt | 比较两个值。 如果第一个值大于第二个值,则将整数值 1 (int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上 | |||
cgt.un | 比较两个无符号的或未经排序的值。 如果第一个值大于第二个值,则将整数值 1 (int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上。 | |||
clt | 比较两个值。 如果第一个值小于第二个值,则将整数值 1 (int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上 | |||
clt.un | 比较无符号的或不可排序的值 value1 和 value2。 如果 value1 小于 value2,则将整数值 1 (int32 ) 推送到计算堆栈上;反之,将 0 ( int32 ) 推送到计算堆栈上 | |||
ckfinite | 如果值不是有限数,则引发 ArithmeticException。 | |||
块操作 | cpblk | 将指定数目的字节从源地址复制到目标地址。 | ||
initblk | 将位于特定地址的内存的指定块初始化为给定大小和初始值 | |||
寻址参数和局部变量 | ||||
方法参数 | 方法参数加载 | ldarg | 将自变量(由指定索引值引用)加载到堆栈上 | |
ldarg.s | 将自变量(由指定的短格式索引引用)加载到计算堆栈上 | |||
ldarg.0 | 将索引为 0 的参数加载到计算堆栈上 | |||
ldarg.1 | 将索引 1 处的参数加载到计算堆栈上 | |||
ldarg.2 | 将索引 2 处的参数加载到计算堆栈上 | |||
ldarg.3 | 将索引 3 处的参数加载到计算堆栈上 | |||
方法参数地址加载 | ldarga | 将参数地址加载到计算堆栈上 | ||
ldarg.s | 以短格式将自变量地址加载到计算堆栈上 | |||
方法参数存储 | starg | 将位于计算堆栈顶部的值存储到位于指定索引的自变量槽中 | ||
starg.s | 将位于计算堆栈顶部的值存储在自变量槽中的指定索引处(短格式) | |||
方法参数列表 | arglist | 返回指向当前方法的参数列表的非托管指针 | ||
局部变量 | 局部变量加载 | ldloc | 将指定索引处的局部变量加载到计算堆栈上 | |
ldloc.s | 将特定索引处的局部变量加载到计算堆栈上(短格式) | |||
ldloc.0 | 将索引 0 处的局部变量加载到计算堆栈上 | |||
ldloc.1 | 将索引 1 处的局部变量加载到计算堆栈上。 | |||
ldloc.2 | 将索引 2 处的局部变量加载到计算堆栈上 | |||
ldloc.3 | 将索引 3 处的局部变量加载到计算堆栈上 | |||
局部变量引用加载 | ldloca | 将位于特定索引处的局部变量的地址加载到计算堆栈上 | ||
ldloca.s | 将位于特定索引处的局部变量的地址加载到计算堆栈上(短格式) | |||
局部变量存储 | stloc | 从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中 | ||
stloc.s | 从计算堆栈的顶部弹出当前值并将其存储在局部变量列表中的 index 处(短格式) | |||
stloc.0 | 从计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表中。 | |||
stloc.1 | 从计算堆栈的顶部弹出当前值并将其存储到索引 1 处的局部变量列表中 | |||
stloc.2 | 从计算堆栈的顶部弹出当前值并将其存储到索引 2 处的局部变量列表中。 | |||
stloc.3 | 从计算堆栈的顶部弹出当前值并将其存储到索引 3 处的局部变量列表中 | |||
其他 | 局部块分配 | localloc | 从本地动态内存池分配特定数目的字节并将第一个分配的字节的地址(瞬态指针, 类型)推送到计算堆栈上。 | |
前缀指令 | unaligned | 指示当前位于计算堆栈上的地址可能没有与紧接的 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的自然大小对齐。 | ||
volatile | 指定当前位于计算堆栈顶部的地址可以是易失的,并且读取该位置的结果不能被缓存,或者对该地址的多个存储区不能被取消。 | |||
寻址字段 | ||||
ldfld | 查找对象中其引用当前位于计算堆栈的字段的值 | |||
ldsfld | 将静态字段的值推送到计算堆栈上。 | |||
ldflda | 查找对象中其引用当前位于计算堆栈的字段的地址。 | |||
ldsflda | 将静态字段的地址推送到计算堆栈上。 | |||
stfld | 用新值替换在对象引用或指针的字段中存储的值。 | |||
stsfld | 用来自计算堆栈的值替换静态字段的值。 | |||
调用方法 | ||||
直接调用 | jmp | 退出当前方法并跳至指定方法 | ||
call | 调用由传递的方法说明符指示的方法 | |||
callvirt | 对对象调用后期绑定方法,并且将返回值推送到计算堆栈上。 | |||
间接调用 | ldftn | 将指向实现特定方法的本机代码的非托管指针(native int 类型)推送到计算堆栈上。 | ||
ldvirtftn | 将指向实现与指定对象关联的特定虚方法的本机代码的非托管指针(native int 类型)推送到计算堆栈上。 | |||
calli | 通过调用约定描述的参数调用在计算堆栈上指示的方法(作为指向入口点的指针)。 | |||
尾部调用 | tail | 执行后缀的方法调用指令,以便在执行实际调用指令前移除当前方法的堆栈帧。 | ||
带约束的虚调用 | constrained | 约束要对其进行虚方法调用的类型 | ||
寻址类和值类型 | ||||
ldnull | 将空引用(O 类型)推送到计算堆栈上。 | |||
ldobj | 将地址指向的值类型对象复制到计算堆栈的顶部。 | |||
stobj | 将指定类型的值从计算堆栈复制到所提供的内存地址中。 | |||
ldstr | 推送对元数据中存储的字符串的新对象引用。 | |||
cpobj | 将位于对象(&、 或 native int 类型)地址的值类型复制到目标对象(&、 或 native int 类型)的地址。 | |||
newobj | 创建一个值类型的新对象或新实例,并将对象引用(O 类型)推送到计算堆栈上。 | |||
initobj | 将位于指定地址的值类型的每个字段初始化为空引用或适当的基元类型的 0。 | |||
castclass | 尝试将引用传递的对象转换为指定的类。 | |||
isinst | 测试对象引用(O 类型)是否为特定类的实例。 | |||
box | 将值类转换为对象引用(O 类型)。 | |||
unbox | 将值类型的已装箱的表示形式转换为其未装箱的形式。 | |||
unbox.any | 将指令中指定类型的已装箱的表示形式转换成未装箱形式。 | |||
mkrefany | 将对特定类型实例的类型化引用推送到计算堆栈上。 | |||
refanytype | 检索嵌入在类型化引用内的类型标记。 | |||
refanyval | 检索嵌入在类型化引用内的地址(& 类型)。 | |||
ldtoken | 将元数据标记转换为其运行时表示形式,并将其推送到计算堆栈上。 | |||
sizeof | 将提供的值类型的大小(以字节为单位)推送到计算堆栈上。 | |||
throw | 引发当前位于计算堆栈上的异常对象。 | |||
rethrow | 再次引发当前异常。 | |||
向量指令 | ||||
向量创建 | newarr | 将对新的从零开始的一维数组(其元素属于特定类型)的对象引用推送到计算堆栈上 | ||
ldlen | 将从零开始的、一维数组的元素的数目推送到计算堆栈上 | |||
元素地址加载 | ldelema | 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部 | ||
readonly | 指定后面的数组地址操作在运行时不执行类型检查,并且返回可变性受限的托管指针 | |||
元素加载 | ldelem.i1 | 将位于指定数组索引处的 int8 类型的元素作为 int32 加载到计算堆栈的顶部 | ||
ldelem.u1 | 将位于指定数组索引处的 unsigned int8 类型的元素作为 int32 加载到计算堆栈的顶部 | |||
ldelem.i2 | 将位于指定数组索引处的 int16 类型的元素作为 int32 加载到计算堆栈的顶部 | |||
ldelem.u2 | 将位于指定数组索引处的 unsigned int16 类型的元素作为 int32 加载到计算堆栈的顶部 | |||
ldelem.i4 | 将位于指定数组索引处的 int32 类型的元素作为 int32 加载到计算堆栈的顶部 | |||
ldelem.u4 | 将位于指定数组索引处的 unsigned int32 类型的元素作为 int32 加载到计算堆栈的顶部 | |||
ldelem.i8 | 将位于指定数组索引处的 int64 类型的元素作为 int64 加载到计算堆栈的顶部 | |||
ldelem.i | 将位于指定数组索引处的 native int 类型的元素作为 native int 加载到计算堆栈的顶部。 | |||
ldelem.r4 | 将位于指定数组索引处的 float32 类型的元素作为 F 类型(浮点型)加载到计算堆栈的顶部。 | |||
ldelem.r8 | 将位于指定数组索引处的 float64 类型的元素作为 F 类型(浮点型)加载到计算堆栈的顶部。 | |||
ldelem.ref | 将位于指定数组索引处的包含对象引用的元素作为 O 类型(对象引用)加载到计算堆栈的顶部 | |||
元素存储 | 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 类型)替换给定索引处的数组元素。 |