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)
  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/RChen/p/366828.html
Copyright © 2011-2022 走看看