使用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.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |