zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    def __unicode__(self): 或 def __str__(self):
    通过ORM创建数据库链接
    单表查询的API介绍
    数据库的查看以及建立数据库
    基础数据类型
    表单及数据库
    flag标志位
    Console面板小技巧:
    angular入门试水-基本指令理解
    构造方法
  • 原文地址:https://www.cnblogs.com/RChen/p/366828.html
Copyright © 2011-2022 走看看