AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XE2 neue calling convention

Ein Thema von Schorschi5566 · begonnen am 12. Sep 2011 · letzter Beitrag vom 13. Sep 2011
Antwort Antwort
Seite 1 von 2  1 2      
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

XE2 neue calling convention

  Alt 12. Sep 2011, 22:16
Servus Gemeinde,

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

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.

Es geht mir eigentlich nur um die neue calling convention.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:27
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.
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.477 Beiträge
 
Delphi 12 Athens
 
#3

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:30
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!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#4

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:32
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.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:37
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
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#6

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:40
Wenn Du wirklich noch Assembler nutzen willst, solltest Du dir mal folgende Seiten anschauen:

Inline Assembler
Assembler Syntax
Lars
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:46
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
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.477 Beiträge
 
Delphi 12 Athens
 
#8

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 22:48
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...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: XE2 neue calling convention

  Alt 12. Sep 2011, 23:07
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.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.651 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: XE2 neue calling convention

  Alt 13. Sep 2011, 06:16
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:

xe2parameterasm.jpg

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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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