加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用Delphi内联汇编程序创建类实例

发布时间:2020-12-15 04:14:20 所属栏目:大数据 来源:网络整理
导读:我想要做的是,使用assembly,创建一个类实例,调用其中一个方法,然后释放实例. 我知道我错过了一些非常重要的东西,可能很简单,但我不知道是什么. program Project2;{$APPTYPE CONSOLE}uses SysUtils;type TSomeClass = class(TObject) private FCreateDateTime
我想要做的是,使用assembly,创建一个类实例,调用其中一个方法,然后释放实例.

我知道我错过了一些非常重要的东西,可能很简单,但我不知道是什么.

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSomeClass = class(TObject)
  private
    FCreateDateTime: string;
  public
    constructor Create;
    procedure SayYeah;
  end;

constructor TSomeClass.Create;
begin
  FCreateDateTime := DateTimeToStr(Now);
end;

procedure TSomeClass.SayYeah;
begin
  Writeln('yeah @ ' + FCreateDateTime);
end;

procedure Doit;
asm
  CALL TSomeClass.Create; // <= Access Violation
  CALL TSomeClass.SayYeah;
  CALL TSomeClass.Free;
end;

begin
  try
    Doit;
  except
    on E: Exception do
      Writeln(E.ClassName,': ',E.Message);
  end;
  Readln;
end.

仅供参考:我想了解如何在低水平实现这一目标,而不是另一种方式.

更新:

感谢Andreas Rejbrand,我找到了罪魁祸首:

UPDATE2:

感谢Arnaud使用EBX而不是PUSH / POP EAX来发现缺陷

var
  TSomeClass_TypeInfo: Pointer;

procedure Doit;
asm
  MOV DL,$01;
  MOV EAX,TSomeClass_TypeInfo;
  CALL TSomeClass.Create;
  PUSH EAX;
  CALL TSomeClass.SayYeah; // call method
  POP EAX;
  MOV DL,$01;
  CALL TSomeClass.Free; // pointer to instance(Self) is expected in EAX
end;

begin
  TSomeClass_TypeInfo := TSomeClass;
  try
    Doit;
  except
    on E: Exception do
      Writeln(E.ClassName,E.Message);
  end;
  Readln;
end.

解决方法

你可以在Delphi程序集编程的优秀指南中阅读这个,最初找到 here.不幸的是,该网站已关闭,但你可以找到一个存档版本 here.特别注意 page 5.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读