estoy corriendo en algún comportamiento extraño con ensamblador en línea de Delphi, como se ha demostrado en este muy corto y sencillo programa:comportamiento inusual en el bloque de montaje 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.
Es sólo por el bien de ejemplo (mov
ing [asdf]
en eax
no hace mucho, pero funciona para el ejemplo). Si nos fijamos en el conjunto de este programa, se verá que
mov eax, [asdf]
se ha convertido en
mov eax, ds:[4]
(representada por OllyDbg) que obviamente se bloquea. Sin embargo, si usted hace esto:
var
temp: TAsdf;
begin
temp := asdf;
asm
int 3;
mov eax, [temp];
end;
Cambia a mov eax, [ebp-4] que trabaja. ¿Por qué es esto? Normalmente estoy trabajando con C++ y estoy acostumbrado a usar vars de instancia como ese, es posible que esté usando variables de instancia incorrectas.
EDITAR: Sí, eso fue todo. Cambiar mov eax, [asdf]
a mov eax, [Self.asdf]
soluciona el problema. Lo siento por eso.