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 (movinsigne [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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top