|
|
|
研究心得-------CPU信息的获得,比较全面的。 |
热 ★★★★ |
|
研究心得-------CPU信息的获得,比较全面的。 |
|
作者:闵涛 文章来源:闵涛的学习笔记 点击数:2326 更新时间:2009/4/23 18:38:05 |
|
p;//****************************************************** //cpuid指令,因为Delphi的汇编编译器没有内置该指令, //所以用该指令的机器语言代码$0F,$A2来实现 //****************************************************** db $0F,$A2 mov rEAX,EAX mov rEBX,EBX mov rECX,ECX mov rEDX,EDX pop EDX pop ECX pop EBX pop EAX end; Result.EAX := rEAX; Result.EBX := rEBX; Result.ECX := rECX; Result.EDX := rEDX; end;
function GetCPUSpeed: Real; const timePeriod = 1000; var HighFreq, TestFreq, Count1, Count2: int64; TimeStart : integer; TimeStop : integer; ElapsedTime : dword; StartTicks : dword; EndTicks : dword; TotalTicks : dword; begin StartTicks := 0; EndTicks := 0; if QueryPerformanceFrequency(HighFreq) then begin
TestFreq := HighFreq div 100;
QueryPerformanceCounter(Count1); repeat QueryPerformanceCounter(Count2); until Count1 <> Count2; asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov StartTicks,eax pop ebx end;
repeat QueryPerformanceCounter(Count1); until Count1 - Count2 >= TestFreq;
asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov EndTicks,eax pop ebx end;
ElapsedTime := MulDiv(Count1 - Count2, 1000000, HighFreq); end else begin timeBeginPeriod(1); TimeStart := timeGetTime;
repeat TimeStop := timeGetTime; until TimeStop <> TimeStart;
asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov StartTicks,eax pop ebx end;
repeat TimeStart := timeGetTime; until TimeStart - TimeStop >= timePeriod;
asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov EndTicks,eax pop ebx end; timeEndPeriod(1);
ElapsedTime := (TimeStart - TimeStop) * 1000; end; TotalTicks := EndTicks - StartTicks; result := TotalTicks / ElapsedTime; end;
function getCPUInfo: TCPUInfo; type TRegChar = array[0..3] of char; var lvCPUID : TCPUIDResult; I : Integer; begin lvCPUID := CPUID(0); Result.Vendor := TRegChar(lvCPUID.EBX) + TRegChar(lvCPUID.EDX) + TRegChar(lvCPUID.ECX); lvCPUID := CPUID(1); Result.Frequency := GetCPUSpeed; Result.Family := (lvCPUID.EAX and $F00) shr 8; Result.Model := (lvCPUID.EAX and $78) shr 4; Result.Stepping := (lvCPUID.EAX and $F); Result.EFamily := (lvCPUID.EAX and $7800000) shr 20; Result.EModel := (lvCPUID.EAX and $78000) shr 16; Result.EStepping := (lvCPUID.EAX and $F); Result.APIC := (lvCPUID.EBX and $1FE00000) shr 23; Result.Brand := lvCPUID.EBX and $7F; Result.MMX := (lvCPUID.EDX and $800000) = $800000; Result.SSE := (lvCPUID.EDX and $2000000) = $2000000; Result.SSE2 := (lvCPUID.EDX and $4000000) = $4000000; Result.IA64 := (lvCPUID.EDX and $40000000) = $40000000; lvCPUID := CPUID($80000001); Result.MMXPlus := (lvCPUID.EDX and $800000) = $800000; Result.AMD3DNow := (lvCPUID.EDX and $10000000) = $10000000; Result.AMD3DNowPlus := (lvCPUID.EDX and $8000000) = $8000000; Result.X86_64 := (lvCPUID.EDX and $40000000) = $40000000; if (Result.Vendor = ''''GenuineIntel'''') and ((Result.Family <> 15) or (Result.EFamily <> 0)) then Result.Name := Result.Vendor + '''' Processor'''' else begin Result.Name := ''''''''; for i := 2 to 4 do begin lvCPUID := CPUID($80000000 + i); Result.Name := Result.Name + TRegChar(lvCPUID.EAX) + TRegChar(lvCPUID.EBX) + TRegChar(lvCPUID.ECX) + TRegChar(lvCPUID.EDX); end; Result.Name := Trim(Result.Name); end; end;
procedure TForm1.FormShow(Sender: TObject);
procedure WriteSupport(Edit: TEdit; Sup: Boolean); begin if Sup then edit.Text := ''''支持'''' else edit.Text := ''''不支持''''; end; var CPU : TCPUInfo; begin CPU := getCPUInfo; EditCPUName.Text := CPU.Name; EditVendor.Text := CPU.Vendor; EditF.Text := Inttostr(CPU.Family); EditM.Text := Inttostr(CPU.Model); EditStep.Text := Inttostr(CPU.Stepping); EditFE.Text := Inttostr(CPU.EFamily); EditME.Text := Inttostr(CPU.EModel); EditStepE.Text := Inttostr(CPU.EStepping); Edit33.Text := Inttostr(CPU.APIC); EditBrand.Text := Inttostr(CPU.Brand); EditSpeed.Text := FormatFloat(''''###.##'''', CPU.Frequency); WriteSupport(EditMMX, CPU.MMX); WriteSupport(EditSSE, CPU.SSE); WriteSupport(EditSSE2, CPU.SSE2); WriteSupport(EditIA64, CPU.IA64); WriteSupport(EditMMXp, CPU.MMXPlus); WriteSupport(Edit3DNow, CPU.AMD3DNow); WriteSupport(Edit3DNowp, CPU.AMD3DNowPlus); WriteSupport(EditX86_64, CPU.X86_64); end;
一个真正的CPU检测软件还要能够检测到缓存信息等等。大家可以参考上面表格所示的参数,在这些代码中作扩展。
CPU的资料好难找啊。Intel和AMD得还好一些,其他公司的简直是大海捞针。我尽力了,只能整理到这些了。
上一页 [1] [2] [3] [4] 没有相关教程
|
|
教程录入:mintao 责任编辑:mintao |
|
|
上一篇教程: 简单的在线升级的实现方法 下一篇教程: Sender 的應用:所有Edit共用一個過濾格式 |
|
|
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网] |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
|
|
|
|
|
|
|
同类栏目 |
|
|
赞助链接 |
|
|
500 - 内部服务器错误。
|
|
|
|
|
|