转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
研究心得-------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 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台