IL常用指令
不少朋友会喜欢研究深入,相信在c#这门语言中深入下去必然接触到IL语言,我的建议是如果基础牢靠之后,可以深入研究clr,同时元数据也是需要知晓的,clr不仅仅是面向c#的,事实上任何面向clr的编译器编译的il都能够在clr平台上运行起来而不必关心是什么语言写的,要看懂里面的代码,自然少不了一些常用的命令了,下面就是IL中常用的命令,要全面观察IL指令可以去相关资料学习。
IL常用指令
|
指令 |
描述 |
|
.assembly <程序集名称> {} |
设置程序集 |
|
ldc.i4.n |
把一个 32位的常量(n从0到8)装入堆栈 |
|
stloc.n |
把一个从堆栈中返回的值存入第n(n取0~8)个局部变量 |
|
add |
2个值相加。命令的参数必须在调用前装入堆栈,该函数从堆栈中移除参数并把运算后的结果压入堆栈 |
|
sub |
2个值相减 |
|
mul |
2个值相乘 |
|
newarr type |
生成一个元素类型为type 的数组。数组的大小必须在调用该命令前装入堆栈。该命令会把一个数组的引用装入堆栈 |
|
stelem.i4 |
给一个数组成员赋值。数组的引用、下标和值必须在调用该命令前装入堆栈 |
|
ldelema type |
把数组元素的地址装入堆栈。数组的引用和下标必须在调用该命令前装入堆栈。地址用来调用非静态函数 |
|
ldlen |
把数组的长度装入堆栈。数组的引用必须在调用该命令前装入堆栈 |
|
ldloca.s variable |
把变量的地址装入堆栈 |
|
ldc.i4.s value |
把一个Int32的常量装入堆栈(用于大于8位的数) |
|
conv.i4 |
把堆栈中值转换成Int32类型 |
|
call instance function(arguments) |
调用类的非静态函数 |
|
bge.s label |
跳转至label 如果value1≥value 2. Values 1和 2 必须在调用本命令前装入堆栈 |
|
br.s label |
跳转至label |
|
box value type |
把一个值类型转成一个Object,并把该Object的引用装入堆栈 |
|
blt.s label |
跳转至label 。如果value 1小于 value 2. Values 1 和 2 必须在调用本命令之前装入堆栈 |
|
ldelem.i4 |
把一个数组元素装入堆栈。数组引用和下标必须在调用本命令之前装入堆栈 |
|
ldarga.s argument |
把函数参数的地址装入堆栈 |
|
dup |
在堆栈上复制一个值 |
|
stind.i4 |
存储值的地址。地址和值必须在调用本命令之前装入堆栈 |
|
.field |
定义类成员。和关键字public、private、static等一起使用 |
|
stsfld static field |
用堆栈中的值替换静态字段的值 |
|
ldfld field |
把一个非静态字段装入堆栈。类实例的地址必须在调用本命令之前装入堆栈 |
|
ldarg.n |
把第n个参数装入堆栈。在非静态函数中,第0个参数是一个隐含的参数,代表this |
|
newobj constructor |
用构造函数constructor生成一个类的实例。构造函数的参数必须在调用本函数之前先装入堆栈。一个类的实例会被生成并装入堆栈 |
|
callvirt instance function |
调用一个对象的后期绑定方法 |

浙公网安备 33010602011771号