Я бегу в некоторые странные поведения с встроенного ассемблера в 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
ИНГ [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++, и я привык использовать такие экземпляры экземпляров, возможно, что я неправильно использую переменные экземпляра.
EDIT: Да, это было. Изменение mov eax, [asdf]
до mov eax, [Self.asdf]
устраняет проблему. Извини за это.