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

调用一个对象的后期绑定方法

posted @ 2014-09-01 11:49  huahuajjh  阅读(98)  评论(0)    收藏  举报