この非常に短くて単純なプログラムで示されているように、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.
これは単なる例です ( mov
ing [asdf]
intoeax
はあまり機能しませんが、この例では機能します)。このプログラムのアセンブリを見ると、
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]
と問題が解決します。申し訳ありません。