Atitit..net clr il指令集 以及指令分类 与指令详细说明
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Atitit..net clr il指令集 以及指令分类 与指令详细说明相关的知识,希望对你有一定的参考价值。
Atitit..net clr il指令集 以及指令分类 与指令详细说明
1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1
1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM),
也就是说,它们的指令集(Instruction Set)都是採用堆叠运算的方式:执行时的资料都是先放在堆叠中,再进行运算。JavaVM 有約 200 个指令(Instruction),每个指令都是 1 byte 的 opcode(操作码),后面接不等数目的参数;.NET CLR 有超过220个指令,但是有些指令使用相同的 opcode,所以 opcode 的数目比指令数略少。特別注意,.NET 的 opcode 長度並不固定,大部分的 opcode 長度是 1 byte,少部分是 2 byte。
1.2. 查看工具ILDASM
将此原始码编译之后,可以得到一个 EXE的程序。我们可以通过 ILDASM.EXE(图-0) 來反编译 EXE 以观察IL。我将 Main() 的 IL 反编译条列如下,这里共有十八道IL 指令,有的指令(例如 ldstr 与 box)后面需要接参数,有的指令(例如 ldc.i4.1与与add)后面不需要接参数。
1.3. 此程式执行时,关键的记忆体有三种,分別是:
1、Managed Heap:这是动态配置(Dynamic Allocation)的记忆体,由 Garbage Collector(GC)在执行时自动管理,整个Process 共用一个 Managed Heap。
2、Call Stack:这是由 .NET CLR 在执行时自动管理的记忆体,每个 Thread 都有自己专属的 Call Stack。每调用一次 method,就会使得Call Stack 上多了一个 Record Frame;调用完毕之后,此 Record Frame 会被丢弃。一般來说,Record Frame 內记录着 method 参数(Parameter)、返回位址(Return Address)、以及区域变数(Local Variable)。Java VM 和 .NET CLR 都是使用 0, 1, 2… 编号的方式來识別区别变数。
3、Evaluation Stack:这是由 .NET CLR 在执行时自动管理的记忆体,每个 Thread 都有自己专属的 Evaluation Stack。前面所谓的堆叠式虚拟机器,指的就是这个堆叠。
后面有一连串的示意图,用來解说在执行时此三种记忆体的变化。首先,在进入 Main() 之后,尚未执行任何指令之前,记忆体的状況如图1 所示:
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:[email protected]
转载请注明来源: http://www.cnblogs.com/attilax/
1.4. Il指令集
一些 IL 语言解释:
1.4.1. Mov指令
Public field Static Cpblk 将指定数目的字节从源地址复制到目标地址。
Public field Static Cpobj 将位于对象(&、* 或 natural int 类型)地址的值类型复制到目标对象(&、* 或 natural int 类型)的地址。
Public field Static Ldarg 将参数(由指定索引值引用)加载到堆栈上。
Public field Static Ldarg_0 将索引为 0 的参数加载到计算堆栈上。
Public field Static Ldarg_1 将索引为 1 的参数加载到计算堆栈上。
Public field Static Ldarg_2 将索引为 2 的参数加载到计算堆栈上。
Public field Static Ldarg_3 将索引为 3 的参数加载到计算堆栈上。
Public field Static Ldarg_S 将参数(由指定的短格式索引引用)加载到计算堆栈上。
Public field Static Ldarga 将参数地址加载到计算堆栈上。
Public field Static Ldarga_S 以短格式将参数地址加载到计算堆栈上。
Public field Static Ldc_I4 将所提供的 int32 类型的值作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_0 将整数值 0 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_1 将整数值 1 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_2 将整数值 2 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_3 将整数值 3 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_4 将整数值 4 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_5 将整数值 5 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_6 将整数值 6 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_7 将整数值 7 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_8 将整数值 8 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_M1 将整数值 -1 作为 int32 推送到计算堆栈上。
Public field Static Ldc_I4_S 将提供的 int8 值作为 int32 推送到计算堆栈上(短格式)。
Public field Static Ldc_I8 将所提供的 int64 类型的值作为 int64 推送到计算堆栈上。
Public field Static Ldc_R4 将所提供的 float32 类型的值作为 F (float) 类型推送到计算堆栈上。
Public field Static Ldc_R8 将所提供的 float64 类型的值作为 F (float) 类型推送到计算堆栈上。
Public field Static Ldelem 按照指令中指定的类型,将指定数组索引中的元素加载到计算堆栈的顶部。
Public field Static Ldelem_I 将位于指定数组索引处的 natural int 类型的元素作为 natural int 加载到计算堆栈的顶部。
Public field Static Ldelem_I1 将位于指定数组索引处的 int8 类型的元素作为 int32 加载到计算堆栈的顶部。
Public field Static Ldelem_I2 将位于指定数组索引处的 int16 类型的元素作为 int32 加载到计算堆栈的顶部。
Public field Static Ldelem_I4 将位于指定数组索引处的 int32 类型的元素作为 int32 加载到计算堆栈的顶部。
Public field Static Ldelem_I8 将位于指定数组索引处的 int64 类型的元素作为 int64 加载到计算堆栈的顶部。
Public field Static Ldelem_R4 将位于指定数组索引处的 float32 类型的元素作为 F 类型(浮点型)加载到计算堆栈的顶部。
Public field Static Ldelem_R8 将位于指定数组索引处的 float64 类型的元素作为 F 类型(浮点型)加载到计算堆栈的顶部。
Public field Static Ldelem_Ref 将位于指定数组索引处的包含对象引用的元素作为 O 类型(对象引用)加载到计算堆栈的顶部。
Public field Static Ldelem_U1 将位于指定数组索引处的 unsigned int8 类型的元素作为 int32 加载到计算堆栈的顶部。
Public field Static Ldelem_U2 将位于指定数组索引处的 unsigned int16 类型的元素作为 int32 加载到计算堆栈的顶部。
Public field Static Ldelem_U4 将位于指定数组索引处的 unsigned int32 类型的元素作为 int32 加载到计算堆栈的顶部。
Public field Static Ldelema 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。
Public field Static Ldfld 查找对象中其引用当前位于计算堆栈的字段的值。
Public field Static Ldflda 查找对象中其引用当前位于计算堆栈的字段的地址。
Public field Static Ldftn 将指向实现特定方法的本机代码的非托管指针(natural int 类型)推送到计算堆栈上。
Public field Static Ldind_I 将 natural int 类型的值作为 natural int 间接加载到计算堆栈上。
Public field Static Ldind_I1 将 int8 类型的值作为 int32 间接加载到计算堆栈上。
Public field Static Ldind_I2 将 int16 类型的值作为 int32 间接加载到计算堆栈上。
Public field Static Ldind_I4 将 int32 类型的值作为 int32 间接加载到计算堆栈上。
Public field Static Ldind_I8 将 int64 类型的值作为 int64 间接加载到计算堆栈上。
Public field Static Ldind_R4 将 float32 类型的值作为 F (float) 类型间接加载到计算堆栈上。
Public field Static Ldind_R8 将 float64 类型的值作为 F (float) 类型间接加载到计算堆栈上。
Public field Static Ldind_Ref 将对象引用作为 O(对象引用)类型间接加载到计算堆栈上。
Public field Static Ldind_U1 将 unsigned int8 类型的值作为 int32 间接加载到计算堆栈上。
Public field Static Ldind_U2 将 unsigned int16 类型的值作为 int32 间接加载到计算堆栈上。
Public field Static Ldind_U4 将 unsigned int32 类型的值作为 int32 间接加载到计算堆栈上。
Public field Static Ldlen 将从零开始的、一维数组的元素的数目推送到计算堆栈上。
Public field Static Ldloc 将指定索引处的局部变量加载到计算堆栈上。
Public field Static Ldloc_0 将索引 0 处的局部变量加载到计算堆栈上。
Public field Static Ldloc_1 将索引 1 处的局部变量加载到计算堆栈上。
Public field Static Ldloc_2 将索引 2 处的局部变量加载到计算堆栈上。
Public field Static Ldloc_3 将索引 3 处的局部变量加载到计算堆栈上。
Public field Static Ldloc_S 将特定索引处的局部变量加载到计算堆栈上(短格式)。
Public field Static Ldloca 将位于特定索引处的局部变量的地址加载到计算堆栈上。
Public field Static Ldloca_S 将位于特定索引处的局部变量的地址加载到计算堆栈上(短格式)。
Public field Static Ldnull 将空引用(O 类型)推送到计算堆栈上。
Public field Static Ldobj 将地址指向的值类型对象复制到计算堆栈的顶部。
Public field Static Ldsfld 将静态字段的值推送到计算堆栈上。
Public field Static Ldsflda 将静态字段的地址推送到计算堆栈上。
Public field Static Ldstr 推送对元数据中存储的字符串的新对象引用。
Public field Static Stloc 从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中。
Public field Static Stloc_0 从计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表中。
Public field Static Stloc_1 从计算堆栈的顶部弹出当前值并将其存储到索引 1 处的局部变量列表中。
Public field Static Stloc_2 从计算堆栈的顶部弹出当前值并将其存储到索引 2 处的局部变量列表中。
Public field Static Stloc_3 从计算堆栈的顶部弹出当前值并将其存储到索引 3 处的局部变量列表中。
Public field Static Stloc_S 从计算堆栈的顶部弹出当前值并将其存储在局部变量列表中的 index 处(短格式)。
Public field Static Stobj 将指定类型的值从计算堆栈复制到所提供的内存地址中。
Public field Static Stsfld 用来自计算堆栈的值替换静态字段的值。
Public field Static Sizeof 将提供的值类型的大小(以字节为单位)推送到计算堆栈上。
Public field Static Starg 将位于计算堆栈顶部的值存储到位于指定索引的参数槽中。
Public field Static Starg_S 将位于计算堆栈顶部的值存储在参数槽中的指定索引处(短格式)。
Public field Static Stelem 用计算堆栈中的值替换给定索引处的数组元素,其类型在指令中指定。
Public field Static Stelem_I 用计算堆栈上的 natural int 值替换给定索引处的数组元素。
Public field Static Stelem_I1 用计算堆栈上的 int8 值替换给定索引处的数组元素。
Public field Static Stelem_I2 用计算堆栈上的 int16 值替换给定索引处的数组元素。
Public field Static Stelem_I4 用计算堆栈上的 int32 值替换给定索引处的数组元素。
Public field Static Stelem_I8 用计算堆栈上的 int64 值替换给定索引处的数组元素。
Public field Static Stelem_R4 用计算堆栈上的 float32 值替换给定索引处的数组元素。
Public field Static Stelem_R8 用计算堆栈上的 float64 值替换给定索引处的数组元素。
Public field Static Stelem_Ref 用计算堆栈上的对象 ref 值(O 类型)替换给定索引处的数组元素。
Public field Static Stfld 用新值替换在对象引用或指针的字段中存储的值。
Public field Static Stind_I 在所提供的地址存储 natural int 类型的值。
Public field Static Stind_I1 在所提供的地址存储 int8 类型的值。
Public field Static Stind_I2 在所提供的地址存储 int16 类型的值。
Public field Static Stind_I4  
以上是关于Atitit..net clr il指令集 以及指令分类 与指令详细说明的主要内容,如果未能解决你的问题,请参考以下文章