使用ASM调用对象方法

时间:2012-02-26 12:55:11

标签: delphi assembly delphi-2010 basm

为了更好地解释我想要完成的事情,我将从一些有用的东西开始。

假设我们有一个可以调用另一个过程并将字符串参数传递给它的过程:

procedure CallSaySomething(AProc: Pointer; const AValue: string);
var
  LAddr: Integer;
begin
  LAddr := Integer(PChar(AValue));
  asm
    MOV EAX, LAddr
    CALL AProc;
  end;
end;

这是我们将要调用的程序:

procedure SaySomething(const AValue: string);
begin
  ShowMessage( AValue );
end;

现在我可以像这样打电话给 SaySomething (测试和工作(:):

CallSaySomething(@SaySomething, 'Morning people!');

我的问题是,如何实现类似的功能,但这次 SaySomething 应该是方法

type
  TMyObj = class
  public
    procedure SaySomething(const AValue: string); // calls show message by passing AValue
  end;

所以,如果你还在我身边......,我的目标是达到类似的程序:

procedure CallMyObj(AObjInstance, AObjMethod: Pointer; const AValue: string);
begin
  asm
    // here is where I need help...
  end;
end;

我已经给了它很多镜头,但我的装配知识是有限的。

1 个答案:

答案 0 :(得分:4)

使用asm的原因是什么?

当您调用对象方法时,实例指针必须是方法调用中的第一个参数

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}

uses System.SysUtils;
type
    TTest = class
        procedure test(x : integer);
    end;

procedure TTest.test(x: integer);
begin
    writeln(x);
end;

procedure CallObjMethod(data, code : pointer; value : integer);
begin
    asm
        mov eax, data;
        mov edx, value;
        call code;
    end;
end;

var t : TTest;

begin
    t := TTest.Create();
    try
        CallObjMethod(t, @TTest.test, 2);
    except
    end;
    readln;
end.