IL 汇编学习笔记(三)

原文:http://www.codeproject.com/dotnet/ilassembly.asp

创建和使用类对象


首先我们定义一个简单的类,它只包含一个方法用于计算一个整数的平方(square),代码如下:

.assembly  extern  mscorlib {}
.assembly MathLib
{
    .ver 
1 : 0 : 1 : 0
}

.module MathLib.dll

.
namespace  HangamaHouse
{    
    .
class   public  ansi auto MathClass extends [mscorlib]System.Object
    {        
        .method 
public  int32 GetSquare(int32) cil managed
        {
            .maxstack 
3
            ldarg.
0     //  加载对象的 this 指针到堆栈上
            ldarg. 1     //  实例方法的实际的参数索引总是从 1 开始
            ldarg. 1
            mul
            ret        
        }
    }
}

然后用命令 ILAsm MathLib.il /dll 编译为一个 DLL.

调用的范例如下,这里创建了第一个 dll 里面的类对象,并调用其方法。

.assembly  extern  mscorlib {}
.assembly 
extern  MathLib {.ver  1 : 0 : 1 : 0 }
//
// rest code here
//
.method  static   void     Main() cil managed
{
    .maxstack 
2
    .entrypoint
    .locals init (valuetype [MathLib]HangamaHouse.MathClass mclass)
            
    ldloca mclass  
//  加载对象地址
    ldc.i4  5         //  方法的参数
    call instance int32 [MathLib]HangamaHouse.MathClass::GetSquare(int32)
    ldstr 
" The Square of 5 Returned :  "
    call 
void  [mscorlib]System.Console::Write( string )
    call 
void  [mscorlib]System.Console::WriteLine(int32)

    ret
}

构造器和属性

构造器是这样定义的:

. class   public  MathClass extends [mscorlib]System.ValueType
{
    .field 
private  int32 mValue
    
//  其他代码。。

    .method 
public  specialname rtspecialname instance  void  .ctor() cil managed
    {
        ldarg.
0   //  加载 this 指针
        ldc.i4.s  15
        stfld int32 HangamaHouse.MathClass::mValue 
//  保存到字段
        ret
    }
    
//  其他代码。。

可以看到,构造器实际上是一个叫做 .ctor 的特殊方法。以上代码中使用 specialname 和 rtspecialname 来标注它是一个特殊名称的方法。

在 IL 中,构造器是不会自动被调用的,你必须手工去调用它。下面是一个例子:

.method  public   static   void  Main() cil managed
{
    .maxstack 
2
    .entrypoint
    .locals init (valuetype [MathLib]HangamaHouse.MathClass mclass)

    ldloca mclass
    call instance 
void  [MathLib]HangamaHouse.MathClass::.ctor()


属性的实现跟构造器类似,实际上也是方法。代码如下:

.method  specialname  public  instance int32 get_Value() cil managed
{
    ldarg.
0
    ldfld int32 HangamaHouse.MathClass::mValue
    ret
}
.method specialname 
public  instance  void  set_Value(int32 ) cil managed
{
    ldarg.
0
    ldarg.
1
    stfld int32 HangamaHouse.MathClass::mValue
   
    ret
}       
// Define the property, Value
.property int32 Value()
{
    .
get  instance int32 get_Value()
    .
set  instance  void  set_Value(int32 )
}


使用属性其实就是调用以上代码中的 get_Value 和 set_Value 这两个方法:

.maxstack  2  .locals
init (valuetype [MathLib]HangamaHouse.MathClass tclass)

ldloca tclass
ldc.i4 
25
call instance 
void  [MathLib]HangamaHouse.MathClass::set_Value(int32)
ldloca tclass
call instance int32 [MathLib]HangamaHouse.MathClass::get_Value()
ldstr 
" Propert Value Set to :  "
call 
void  [mscorlib]System.Console::Write( string )
call 
void  [mscorlib]System.Console::WriteLine(int32)


( To be continued)

你可能感兴趣的:(学习笔记)