Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了德尔福装配块中的异常行为大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_772_1@我正在使用Delphi的内联汇编遇到一些奇怪的行为,正如这个@R_96_10584@的程序所示:
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]可以解决问题.对于那个很抱歉.

解决方法

方法接收EAX寄存器中的Self指针.您必须使用该值作为访问对象的基值.所以你的代码将@R_772_9811@: @H_232_2@mov ebx,TBlah[eax].asdf

有关示例,请参见http://www.delphi3000.com/articles/article_3770.asp.

大佬总结

以上是大佬教程为你收集整理的德尔福装配块中的异常行为全部内容,希望文章能够帮你解决德尔福装配块中的异常行为所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。