Delphi XE7 在64位使用内嵌汇编时,不再支持内嵌语句方式,只能是过程,同时在寄存器使用上也有变化,如取CPUID的代码变成如下
type
TCPUIDARRAY = array[1..4] of Longint;
{$IFDEF CPUX64}
function GetCPUID : TCPUIDARRAY; assembler;register;
asm
PUSH RBX {Save affected register}
PUSH RDI
MOV RDI,RCX {@Result}
MOV EAX,1
CPUID
mov [rdi], eax;
mov [rdi+4], ebx;
mov [rdi+8], ecx;
mov [rdi+12], edx;
POP RDI {Restore registers}
POP RBX
end;
{$ELSE}
function GetCPUID : TCPUIDARRAY; assembler;register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;
{$ENDIF}
另外64位下对象的函数,Self 指针是 RCX 不是 RAX