Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Inline Assembler Adressierungsproblem (https://www.delphipraxis.net/88846-inline-assembler-adressierungsproblem.html)

skyobserver 21. Mär 2007 22:43


Inline Assembler Adressierungsproblem
 
Hallo,

ich möchte mit dem Inline-Assembler auf ein dynamisches Array zuzugreifen,
aber offensichtlich macht es einen Unterschied wo das Array deklariert bzw.
ob es dynamisch deklariert ist.


So funktioniert es:

Delphi-Quellcode:
procedure Test;
var
  Feld: array of DWord;
begin
  SetLength(Feld, 5);
  asm
    MOV EAX, Feld;  //Adresse von Feld nach EAX kopieren
    MOV EDX, 7d;    //7 nach EDX
    MOV [EAX], EDX; //DWord an Adresse von Feld mit 7 überschreiben
  end;
end;
Dieser Code schreibt eine 7 in das erste von 5 DWords.


So funktioniert es nicht (Speicherschutzverletzung):

Delphi-Quellcode:
type
  TTest = class(TObject)
  private
    FFeld: array of DWord;
  public
    constructor Create;
  end;

constructor TTest.Create;
begin
  SetLength(FFeld, 5);
  asm
    MOV EAX, FFeld; //Hier scheint nur der Offset von FFeld in EAX zu landen
    MOV EDX, 7d;
    MOV [EAX], EDX; //Speicherschutzverletzung...
  end;
end;

Weiß jemand wie im Assembler die Adresse in diesem Fall ermittelt werden muß?

Hawkeye219 21. Mär 2007 23:11

Re: Inline Assembler Adressierungsproblem
 
Hi,

in einer Methode mußt du die Felder über den (unsichtbaren) Self-Zeiger adressieren:

Delphi-Quellcode:
constructor TTest.Create;
begin
  SetLength(FFeld, 5);
  asm
    MOV EAX, Self
    MOV EAX,[EAX].FFeld
    MOV EDX, 7d;
    MOV [EAX], EDX;
  end;
end;
Gruß Hawkeye

skyobserver 21. Mär 2007 23:21

Re: Inline Assembler Adressierungsproblem
 
:thumb: Besten Dank! So funktioniert es!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz