Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi VAR-Parameter beim Inline-Assembler nutzen (https://www.delphipraxis.net/116048-var-parameter-beim-inline-assembler-nutzen.html)

skyobserver 22. Jun 2008 16:42


VAR-Parameter beim Inline-Assembler nutzen
 
Hallo,


wie kann ich in einer Assembler-Prozedur auf den Wert eines VAR-Parameters zugreifen?
Ich habe folgendes probiert:

Delphi-Quellcode:
procedure Test(var x: DWord);
asm
  MOV EAX, DWORD PTR [x]
  ADD EAX, 4711
  MOV DWORD PTR [x], EAX
end;
Das scheint aber falsch zu sein...


Delphi-Quellcode:
procedure Test(var x: DWord);
var
  z: DWord;
begin
  z := x;
  asm
    MOV EAX, z
    ADD EAX, 4711
    MOV z, EAX
  end;
  x := z;
end;
Datt klappett...iss aber nich doll...


Wo mache ich da Blödsinn?

Die Antwort muß entweder furchtbar einfach oder furchtbar schwer sein,
denn ich habe bei der Suche nichts in dieser Art gefunden...

Apollonius 22. Jun 2008 16:47

Re: VAR-Parameter beim Inline-Assembler nutzen
 
Du musst bedenken, dass x "in Wirklichkeit" ein Zeiger auf einen DWord ist. Also musst du erst x in einen Register schieben und dann den Register dereferenzieren.
Wenn ich komplette Prozeduren in Inline-Assembler schreibe, greife ich nie auf die Parameter direkt zu, sondern immer aufrufkonventionabhängig über die Register oder den Stack. Dann weiß ich nämlich, dass mir Delphi nicht dazwischenfunkt.

skyobserver 22. Jun 2008 16:53

Re: VAR-Parameter beim Inline-Assembler nutzen
 
Wie dereferenziere ich denn korrekt?
Mein erster Versuch sollte das eigentlich machen...

Ist es richtig das der Zeiger auf x bereits in EAX liegt?

Neutral General 22. Jun 2008 16:54

Re: VAR-Parameter beim Inline-Assembler nutzen
 
Hi,

Zitat:

Zitat von skyobserver
Ist es richtig das der Zeiger auf x bereits in EAX liegt?

Ja genau.

Versuchs mal so:

Delphi-Quellcode:
procedure Test(var x: DWord);
asm
  add [eax],4711 // Dereferenzieren mit den [ ]
  // entspricht x^ := x^ + 4711;
end;
Gruß
Neutral General

skyobserver 22. Jun 2008 17:28

Re: VAR-Parameter beim Inline-Assembler nutzen
 
:-D Danke, das war die Lösung!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 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