现在的位置: 首页 > 综合 > 正文

《你必须知道的.NET》第3章学习笔记

2013年10月14日 ⁄ 综合 ⁄ 共 1447字 ⁄ 字号 评论关闭

.Net反编译工具ILDASM语言IL语言学习

变量声明:
.locals:声明局部变量。例:
.locals init (
[0] int32 i,
[1] string str,
[2] char c
)

IL_0001:  ldc.i4.2  //2入栈
IL_0002:  stloc.0  //或:IL_0002:   stloc.i   将栈顶元素取出存入0号变量i中

以上两行的C#代码:int i=2

基本运算符:
add:+
sub:-
mul:*
div:/
rem:mod
cgt:>
clt:cep:=
1:true
0:false
not:一元not
and:二元与and
or:或
xor:异或
shl:左移
shr:右移
变体指令:add.ovf  流出检查     add.vof.un  两个无符号整数相加后执行溢出检查

关键字介绍:

.assembly:定义编译目标或加载外部库,例:
.assembly extern mscorlb:加载外部库
.assembly HelloWorld:编译目标HelloWorld

.ctor:构造函数

.ver:引用版本

.publickeytoken:应用程序实际公钥标记,用于唯一确定程序集

.moudle:程序集指令,表明定义的模块的元数据,以指定当前模块,程序由模块组成

.imagebase:影像基地址

.file alignment:文件对齐数值

.subsystem:连接系统类型,0x0003表示由控制台运行

.corflags:设置运行库头文件标志,默认为1

.class:类

public:访问控制权限,公开

auto:程序加载时内存布局由CLR决定

ansi:让没有被托管和被托管代码间无缝转换

beforefieldinit:使运行库可以在任意时间执行类型的构造函数方法

cil managed:指示编译器为托管代码

.maxstack:评估堆栈可容纳数据项的最大个数

call:调用静态方法

callvirt:调用实例方法

ret:执行返回

.entrypoint:程序入口

ldstr:将字符串压栈

hidebysig:表示如果当前类作为父类时,类中的方法将不会被继承

IL_0000:标记代码行开头,在此之前的一般为变量声明和初始化

ldarg.0:装载第一个成员参数

stloc.2:从计算堆栈的顶部弹出当前值并将其存储到指定索引(此处为第三个变量)处的局部变量列表中。

ldloc.2:将指定索引处的局部变量加载到计算堆栈上。

堆栈操作指令:

CLR中,任何有意义的操作都是在堆栈上完成的,把数据加载到栈上和加载栈上数据两种操作是最常用的操作,常用栈操作如下表:

指令 说明
ldarg/ldarga 装载成员的一个参数,后者装载的是参数的地址
ldfld/ldsfld 装载实例字段/装载静态字段
ldc 装载数字常量,ldc.i4 5:整数5以4字节整数装入栈中
ldelem 装载数组元素互堆栈
ldlen 装载数据的长度
ldind 加载间接寻址,即以地址来访问和操作数据
ldstr 加载字符串到栈上
.s 指令后加.s表示只取用单个字节

更多操作指令请参见MSDN中的OpCodes类

流程控制:

主要包括:br,br.s,brtrue,brfalse(br相当于‘goto’)

CLR支持两种数据类型:值类型(valuetype)和引用类型(类类型,class)

initobj:初始化值类型
newobj:分配和初始化对象

CLR中static表示静态方法,instance修饰实例方法,分别使用call和callvirt来调用,而calli为间接调用,通过函数指针来执行方法调度。

抱歉!评论已关闭.