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