大佬教程收集整理的这篇文章主要介绍了德尔福装配块中的异常行为,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
program test; {$APPTYPE CONSOLE} uses SysUtils; type TAsdf = class public int: Integer; end; TBlah = class public asdf: TAsdf; constructor Create(a: TAsdf); procedure Test; end; constructor TBlah.Create(a: TAsdf); begin asdf := a; end; procedure TBlah.Test; begin asm mov eax,[asdf] end; end; var asdf: TAsdf; blah: TBlah; begin asdf := TAsdf.Create; blah := TBlah.Create(asdf); blah.Test; readln; end.
这仅仅是为了举例(将[asdf]移动到eax中并没有做太多,但它适用于该示例).如果你看看这个程序的程序集,你会看到
@H_232_2@mov eax,[asdf]已经变成了
@H_232_2@mov eax,ds:[4](由OllyDbg代表)显然崩溃了.但是,如果你这样做:
var temp: TAsdf; begin temp := asdf; asm int 3; mov eax,[temp]; end;
它变成了@H_82_17@mov eax,[ebp-4]
哪个有效.为什么是这样?我通常使用C而且我习惯使用类似的实例变量,可能是因为我使用的是实例变量错误.
编辑:是的,就是这样.将mov eax,[asdf]更改为mov eax,[Self.asdf]可以解决问题.对于那个很抱歉.
有关示例,请参见http://www.delphi3000.com/articles/article_3770.asp.
以上是大佬教程为你收集整理的德尔福装配块中的异常行为全部内容,希望文章能够帮你解决德尔福装配块中的异常行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。