📄 cpuinfo.pas
字号:
unit CPUInfo;
interface
uses Windows, SysUtils;
function GetCPUID: string;
function GetCPUVendor: string;
function GetCPUSpeed: string;
implementation
const
ID_BIT = $200000; // EFLAGS ID bit
function IsCPUIDAvailable: 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: string;
type
TCPUID = array[1..4] of Longint; //cpuid
function CPUID: 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;
var
I: Integer;
thisId: TCPUID;
begin
for I := Low(thisId) to High(thisId) do thisId[I] := -1;
thisId := CPUID;
if IsCPUIDAvailable then
result := IntToHex(thisId[1], 8) + '-' + IntToHex(thisId[2], 8) + '-' + IntToHex(thisId[3], 8) + '-' + IntToHex(thisId[4], 8)
else
Result := '00000000-00000000-00000000-00000000';
end;
function GetCPUVendor: string;
type
TVendor = array[0..11] of char; //cpuid
function CPUVendor: 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;
begin
Result := CPUVendor;
end;
function GetCPUSpeed: string;
const
DelayTime = 500; //时间单位是毫秒
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh //rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh //rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := FloatToStr(TimerLo / (1000.0 * DelayTime));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -