以下方法还是通过汇编实现,不过针对x64做了调整,以支持x86和x64两种环境,最后注释里是使用示例,在d10.1up2中测试通过,代码如下:

// 获取cpu序列号

type

   TCPUID = array [1 .. 4] of Longint;

 

function GetCPUID: TCPUID;

asm

{$IF Defined(CPUX86)}

   push ebx

   push edi

   mov edi, eax

   mov eax, 1

   dw $A20F

   stosd

   mov eax, ebx

   stosd

   mov eax, ecx

   stosd

   mov eax, edx

   stosd

   pop edi

   pop ebx

{$ELSEIF Defined(CPUX64)}

   PUSH RBX

   PUSH RDI

   MOV RDI,RCX

   MOV EAX,1

   CPUID

   mov [rdi], eax;

   mov [rdi+4], ebx;

   mov [rdi+8], ecx;

   mov [rdi+12], edx;

   POP RDI

   POP RBX

{$IFEND}

(* 调用示例

   var id: TCPUID;

   id := GetCPUID;

   ShowMessage(IntToHex(id[4], 8) + IntToHex(id[1], 8));

*)

end;