|
@@ -1,21 +1,25 @@
|
|
{ %cpu=x86_64 }
|
|
{ %cpu=x86_64 }
|
|
|
|
|
|
|
|
+{$ifdef FPC}
|
|
|
|
+ {$PIC OFF}
|
|
|
|
+{$endif FPC}
|
|
|
|
+
|
|
program asmclass;
|
|
program asmclass;
|
|
{$mode delphiunicode}
|
|
{$mode delphiunicode}
|
|
{$asmmode intel}
|
|
{$asmmode intel}
|
|
type
|
|
type
|
|
TMyClass = class
|
|
TMyClass = class
|
|
public
|
|
public
|
|
- Data: longint;
|
|
|
|
- function AsmToClass: longint; ms_abi_default;
|
|
|
|
|
|
+ Data: int64;
|
|
|
|
+ function AsmToClass: int64; ms_abi_default;
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TMyClass.AsmToClass: longint; ms_abi_default;
|
|
|
|
|
|
+function TMyClass.AsmToClass: int64; ms_abi_default;
|
|
asm
|
|
asm
|
|
mov RAX, Self.Data // Error: Can't access fields directly for parameters
|
|
mov RAX, Self.Data // Error: Can't access fields directly for parameters
|
|
end;
|
|
end;
|
|
|
|
|
|
-function AsmToClassProc(Inst: TMyClass): longint; ms_abi_default;
|
|
|
|
|
|
+function AsmToClassProc(Inst: TMyClass): int64; ms_abi_default;
|
|
asm
|
|
asm
|
|
mov RAX, Inst.Data // Error: Can't access fields directly for parameters
|
|
mov RAX, Inst.Data // Error: Can't access fields directly for parameters
|
|
end;
|
|
end;
|
|
@@ -29,13 +33,14 @@ var
|
|
C: TMyClass;
|
|
C: TMyClass;
|
|
begin
|
|
begin
|
|
C := TMyClass.Create;
|
|
C := TMyClass.Create;
|
|
- c.data:=123548;
|
|
|
|
- if C.AsmToClass<>123548 then
|
|
|
|
|
|
+ c.data:=$123456789AB;
|
|
|
|
+ if C.AsmToClass<>$123456789AB then
|
|
halt(1);
|
|
halt(1);
|
|
- if AsmToClassProc(C)<>123548 then
|
|
|
|
|
|
+ if AsmToClassProc(C)<>$123456789AB then
|
|
halt(2);
|
|
halt(2);
|
|
|
|
|
|
if AsmToClassProc2(C)<>ppointer(c)^ then
|
|
if AsmToClassProc2(C)<>ppointer(c)^ then
|
|
halt(3);
|
|
halt(3);
|
|
C.Free;
|
|
C.Free;
|
|
|
|
+ writeln('ok');
|
|
end.
|
|
end.
|