我在使用Delphi的内联汇编时遇到了一些奇怪的问题,这在下面这个非常简短的程序中得到了展示:
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
中并没有太多作用,但对于示例来说可以工作)。如果您查看此程序的汇编代码,您会发现
mov eax, [asdf]
已转化为
mov eax, ds:[4]
(如OllyDbg所示)会导致崩溃。 但是,如果您执行以下操作:
var
temp: TAsdf;
begin
temp := asdf;
asm
int 3;
mov eax, [temp];
end;
它变成了mov eax,[ebp-4],这样就可以工作了。为什么呢?我通常使用C++并习惯于使用实例变量,可能是我使用实例变量的方式不正确。
编辑:是的,就是这个问题。将“mov eax,[asdf]”更改为“mov eax,[Self.asdf]”即可解决问题。对此我感到抱歉。