Comportement inhabituel dans le bloc d'assemblage de Delphi
-
07-11-2019 - |
Question
Je rencontre un comportement étrange avec l'assemblage en ligne de Delphi, comme le montre ce programme très court et simple:
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.
C'est juste pour l'exemple (mov
insigne [asdf]
dans eax
ne fait pas grand-chose, mais cela fonctionne pour l'exemple). Si vous regardez l'assemblée pour ce programme, vous verrez que
mov eax, [asdf]
a été transformé en
mov eax, ds:[4]
(tel que représenté par Ollydbg) qui se bloque évidemment. Cependant, si vous faites ceci:
var
temp: TAsdf;
begin
temp := asdf;
asm
int 3;
mov eax, [temp];
end;
Il change pour Mov Eax, [EBP-4] qui fonctionne. Pourquoi est-ce? Je travaille généralement avec C ++ et j'ai l'habitude d'utiliser des vêtements d'instance comme ça, il se peut que j'utilise des variables d'instance erronées.
Edit: oui, c'était tout. En changeant mov eax, [asdf]
à mov eax, [Self.asdf]
résout le problème. Désolé pour ça.
Pas de solution correcte