Вызов метода объекта с использованием ASM - PullRequest
3 голосов
/ 26 февраля 2012

Чтобы лучше объяснить, чего я пытаюсь достичь, я собираюсь начать с чего-то, что работает.

Скажем, у нас есть процедура, которая может вызвать другую процедуру и передать ей строковый параметр:

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 Ответ

4 голосов
/ 26 февраля 2012

в чем причина использования 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.
...