Comportamento insolito nel blocco dell'assemblaggio di Delphi
-
07-11-2019 - |
Domanda
Sto affrontando un comportamento strano con l'assemblaggio in linea di Delphi, come dimostrato in questo programma molto breve e semplice:
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.
È solo per esempio (mov
ing [asdf]
in eax
Non fa molto, ma funziona per l'esempio). Se guardi l'assemblea per questo programma, lo vedrai
mov eax, [asdf]
è stato trasformato in
mov eax, ds:[4]
(come rappresentato da Ollydbg) che ovviamente si schianta. Tuttavia, se lo fai:
var
temp: TAsdf;
begin
temp := asdf;
asm
int 3;
mov eax, [temp];
end;
Cambia in mov eax, [EBP-4] che funziona. Perchè è questo? Di solito sto lavorando con C ++ e sono abituato a usare vari di istanza del genere, potrebbe essere che sto usando le variabili di istanza sbagliate.
EDIT: sì, è stato. Mutevole mov eax, [asdf]
a mov eax, [Self.asdf]
risolve il problema. Mi dispiace per questo.
Nessuna soluzione corretta
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow