建个窗体,放个lable
uses cpu_utl //引用函数,
create 事件写入
if not IsCPUID_Available then
showmessage('没有cpuid')
else
begin
lable1.caption:=inttostr(GetCPUID);
lable2.caption:=GetCPUVendor
end;
cpu_utl.pas的内容;
////////////////////////////////
unit cpu_utl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
StdCtrls, WinTypes, WinProcs, FORMS, Menus, inifiles;
// CPU ID 专用变量==================================
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
//===================================================
//CPU ID 及信息
FUNCTION IsCPUID_Available : BOOLEAN;
register;//是否存在cpuid
FUNCTION GetCPUID : TCPUID;
assembler;
register;//读序列号
FUNCTION GetCPUVendor : TVendor;
assembler;
register;//cpu供应商
implementation
// CPU ID ==================================================
FUNCTION IsCPUID_Available : BOOLEAN;
register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, WITH not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check IF ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,TRUE {Result=TRUE}
@exit:
end;
FUNCTION GetCPUID : TCPUID;
assembler;
register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
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;
FUNCTION GetCPUVendor : TVendor;
assembler;
register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;
end.
不要说还不懂怎么用吧?