我想要做的是,使用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.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。