![]() |
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 ![]() 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:
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.
{$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} 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 |
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.
|
AW: XE2 neue calling convention
Zitat:
|
AW: XE2 neue calling convention
Zitat:
Schlechte Unsitte. :cry: |
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 |
AW: XE2 neue calling convention
Wenn Du wirklich noch Assembler nutzen willst, solltest Du dir mal folgende Seiten anschauen:
![]() ![]() |
AW: XE2 neue calling convention
Danke für den zweiten Link. Also doch die von Microsoft verwendete convention.
Zitat:
//Edit: Spielt's 'ne Rolle, dass die Funktion in einer anderen Funktion deklariert ist? Stichwort: Sowas wie Sender? |
AW: XE2 neue calling convention
Zitat:
|
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: |
AW: XE2 neue calling convention
Liste der Anhänge anzeigen (Anzahl: 1)
![]() Zitat:
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 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz