Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   XE2 neue calling convention (https://www.delphipraxis.net/163013-xe2-neue-calling-convention.html)

Schorschi5566 12. Sep 2011 21:16

XE2 neue calling convention
 
Servus Gemeinde,

ich bastel gerade mal wieder an DEC herum. Ziel ist die Win64-Tauglichkeit. Ob's was wird wissen die Götter. :lol:

Bisher dachte ich, dass die neue calling convention so wie bei Wikipedia beschrieben gültig ist (also die, die Microsoft verwendet).

Das wäre im Win64-Mode: RCX, RDX, R8, R9 im Vergleich zu Win32: EAX, EDX, ECX. Rückgabe jeweils in RAX/EAX bei Pointern und Ganzzahlen.

Bei folgender Funktion aus dem DEC (DECUtil) sieht es jetzt aber wieder völlig anders aus.

Delphi-Quellcode:
  {$IFDEF WIN64}
  function IsClass(AObject: Pointer; AClass: TClass): Boolean;
  asm // safer replacement for Delphi's "is" operator
          MOV    RAX,0
  @@1:   TEST   RDX,RDX
          JE     @@3
          MOV    RDX,[RDX]
          TEST   RDX,RDX
          JE     @@3
          CMP    RDX,R8
          JE     @@2
          MOV    RDX,[RDX].vmtParent
          JMP    @@1
  @@2:   MOV    RAX,1
  @@3:
  end;

  {$ELSE}
  function IsClass(AObject: Pointer; AClass: TClass): Boolean;
  asm // safer replacement for Delphi's "is" operator
  @@1:   TEST   EAX,EAX
          JE     @@3
          MOV    EAX,[EAX]
          TEST   EAX,EAX
          JE     @@3
          CMP    EAX,EDX
          JE     @@2
          MOV    EAX,[EAX].vmtParent
          JMP    @@1
  @@2:   MOV    EAX,1
  @@3:
  end;
  {$ENDIF}
So scheint es zu stimmen. Hab's mit der Registeransicht beim Debuggen getestet. Das würde bedeuten, das RDX=AObject und R8=AClass ist. Kommt mir irgendwie seltsam vor auch wenn's natürlich sein kann, dass der neue Compiler da so seine Besonderheiten hat. War ja früher schon so.

Ist das schon irgendwo dokumentiert? Würde mich über Hinweise freuen. Bitte keine Hinweise zum Code. Hagen wird sich schon was dabei gedacht haben, denke ich mal. 8-)

Es geht mir eigentlich nur um die neue calling convention. ;)


Grüße,
Uwe

daywalker9 12. Sep 2011 21:27

AW: XE2 neue calling convention
 
Ganz ehrlich, ich würde dir empfehlen das in puren Pascal-Code zu schreiben. Ist für alle einfacher zu verstehen und Du bist auch für die nächsten Compilergeneration gerüstet.

Uwe Raabe 12. Sep 2011 21:30

AW: XE2 neue calling convention
 
Zitat:

Zitat von daywalker9 (Beitrag 1123853)
Ganz ehrlich, ich würde dir empfehlen das in puren Pascal-Code zu schreiben. Ist für alle einfacher zu verstehen und Du bist auch für die nächsten Compilergeneration gerüstet.

+1!

Thom 12. Sep 2011 21:32

AW: XE2 neue calling convention
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1123848)
Es geht mir eigentlich nur um die neue calling convention. ;)

Liest hier auch mal irgend jemand die eigentliche Frage? Irgendwie ist es große Mode, daß jeder seinen Senf dazugeben muß, auch wenn es absolut nichts mit der Fragestellung zu tun hat.
Schlechte Unsitte. :cry:

Schorschi5566 12. Sep 2011 21:37

AW: XE2 neue calling convention
 
Hallo Daywalker9,

ich weiß nicht ob du schonmal mit Hagens DEC gearbeitet hast. Er hat da ein feines Stück Software geschrieben. Und er kennt sich mit dem Thema Kryptografie offenbar so gut aus, dass er teilweise Delphifunktionen der Sicherheit wegen umgeschrieben/neugeschrieben hat (siehe Kommentare im Code). Dabei sind eben auch einige Assemblerfunktionen eingeflossen.

Da ich den Code nur ansatzweise verstehe, kann ich nur versuchen eine 1:1-Portierung zu machen ohne größeren Schaden als Nutzen anzurichten. In dem Fall halte ich es für besser den Assemblercode von Win32 auf Win64 zu porten anstatt Ersatzfunktionen in Pascal zu schreiben.

Ansonsten hast du natürlich recht aber in diesem speziellen Fall geht's meiner Meinung nach nicht anders außer Hagen legt selbst Hand an. ;)


Grüße,
Uwe

daywalker9 12. Sep 2011 21:40

AW: XE2 neue calling convention
 
Wenn Du wirklich noch Assembler nutzen willst, solltest Du dir mal folgende Seiten anschauen:

Inline Assembler
Assembler Syntax

Schorschi5566 12. Sep 2011 21:46

AW: XE2 neue calling convention
 
Danke für den zweiten Link. Also doch die von Microsoft verwendete convention.

Zitat:

The first four parameters to inline assembler functions are passed via RCX, RDX, R8, and R9 respectively, except for floating-point arguments which use XMMO, XMM1, XMM2, XMM3. The math coprocessor is not normally used from x64 code. Registers used for function parameters can be modified freely.
Also entweder spinnt meine Kiste oder ich habe den ersten Bug gefunden. In RCX ist definitiv nicht die Adresse von AObject sondern in RDX. Seltsam.

//Edit: Spielt's 'ne Rolle, dass die Funktion in einer anderen Funktion deklariert ist? Stichwort: Sowas wie Sender?

Uwe Raabe 12. Sep 2011 21:48

AW: XE2 neue calling convention
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1123862)
Und er kennt sich mit dem Thema Kryptografie offenbar so gut aus, dass er teilweise Delphifunktionen der Sicherheit wegen umgeschrieben/neugeschrieben hat (siehe Kommentare im Code). Dabei sind eben auch einige Assemblerfunktionen eingeflossen.

In diesem Fall würde ich vorrangig versuchen festzustellen, ob dieses Umschreiben Delphi-eigener Funktionen in XE2 überhaupt noch notwendig ist oder hier sogar kontraproduktiv wirkt. Spätestens bei der Portierung auf MacOS, iOS oder mit den bei XE3 zusätzlichen Zielplattformen wird das wohl kaum zu vermeiden sein. Wenn ich mich recht erinnere, war Assembler in XE2 für x64 anfangs gar nicht vorgesehen...

Schorschi5566 12. Sep 2011 22:07

AW: XE2 neue calling convention
 
Wenn ich viel Zeit hätte würde ich das sicherlich machen. ;)

Ich brauche 'ne Lösung für ein Win64-Projekt und ich möchte dazu DEC verwenden.

Im Übrigen ist Plattformunabhängigkeit nicht das Ende von Assembler, so wie das hier manchmal klingt. Bei DEC spielt Performance sehr wohl eine Rolle, wie man an diversen Tabellen in Hagens Code sehen kann. Pure Pascal ist hier nur eine langsame aber saubere Alternative.

Wenn einer DEC für iOS benötigt, wird er entweder die Assemblerroutinen portieren oder in Pascal schreiben müssen.


Ach und hatte ich gesagt, dass es mir eigentlich nur darum geht, was es für Besonderheiten bei der calling convention des neuen 64-Bit-Compilers gibt? Mir war so. :lol:

jaenicke 13. Sep 2011 05:16

AW: XE2 neue calling convention
 
Liste der Anhänge anzeigen (Anzahl: 1)
In der Hilfe steht das so:
Zitat:

The first four parameters to inline assembler functions are passed via RCX, RDX, R8, and R9 respectively, except for floating-point arguments which use XMMO, XMM1, XMM2, XMM3. The math coprocessor is not normally used from x64 code. Registers used for function parameters can be modified freely.
Nebenbei kannst du statt das Register für das Ergebnis direkt anzusprechen auch @Result benutzen.

Ich habe es gerade kurz ausprobiert, bei mir geht es auch mit RCX und RDX und deine Variante knallt. Auswertung:

Anhang 35160

Das geht bei mir:
Delphi-Quellcode:
  function IsClass(AObject: Pointer; AClass: TClass): Boolean;
  asm // safer replacement for Delphi's "is" operator
          MOV @Result,0
  @@1: TEST RCX,RCX
          JE @@3
          MOV RCX,[RCX]
          TEST RCX,RCX
          JE @@3
          CMP RCX,RDX
          JE @@2
          MOV RCX,[RCX].vmtParent
          JMP @@1
  @@2: MOV @Result,1
  @@3:
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.
Seite 1 von 2  1 2      

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