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 (moving [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
scroll top