| 
 	
 
Delphi下获取CPUID 
 
发布时间:2013年9月11日 作者:未知 查看次数:3008 
Delphi下获取CPUID转:Delphi下获取CPUID一法 
http://my.oschina.net/uian2000/blog/115166 
最近忽然有需求获取CPUID。Google后看到些东西,整理出来,防止忘记。由于我惯用Delphi,这里只列出Delphi下用法。  
CPUID是一个处理器支持的操作指令,用于获取CPU特性信息。详见http://en.wikipedia.org/wiki/CPUID。  
既然与CPU相关,就有适用范围的问题。判断其是否可用,需要检查EFlags的第21为是否可更改,如是,则表示处理器支持。  
Intel 8086/286只有Flags(不E),386的第21位为保留位,无法改写,因此这些CPU均不支持CPUID指令。  
测试CPU是否支持CPUID  
01 | 
function TestCPUID: Boolean;  |    
  
CPUID指令以EAX为参数,返回值分布于EAX,EBX,ECX,EDX四个寄存器,由此,通用的CPUID过程设计如下  
01 | 
procedure GetCPUID(var AAx, ABx, ACx, ADx: Cardinal);  |    
03 | 
  vAx, vBx, vCx, vDx: Cardinal;  |    
06 | 
  vAx := AAx; vBx := ABx; vCx := ACx; vDx := ADx;  |    
23 | 
  AAx := vAx; ABx := vBx; ACx := vCx; ADx := vDx;  |    
  
然后,就可以根据处理器指令手册获取相关信息了。  
如:获取VendorString  
02 | 
  TCardinalChar = packed record |    
04 | 
      0: (CharA, CharB, CharC, CharD: AnsiChar;);  |    
05 | 
      1: (Chars: Cardinal;);  |    
08 | 
function GetVendorString: String;  |    
10 | 
  vAx, vBx, vCx, vDx: Cardinal;  |    
11 | 
  vChars: TCardinalChar;  |    
15 | 
  if not TestCPUID then Exit;  |    
18 | 
  GetCPUID(vAx, vBx, vCx, vDx);  |    
21 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
23 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
25 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
  
或者:获取BrandString  
01 | 
function GetBrandString: String;  |    
03 | 
  vAx, vBx, vCx, vDx: Cardinal;  |    
04 | 
  vChars: TCardinalChar;  |    
07 | 
  if not TestCPUID then Exit;  |    
10 | 
  GetCPUID(vAx, vBx, vCx, vDx);  |    
12 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
14 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
16 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
18 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
20 | 
  GetCPUID(vAx, vBx, vCx, vDx);  |    
22 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
24 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
26 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
28 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
30 | 
  GetCPUID(vAx, vBx, vCx, vDx);  |    
32 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
34 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
36 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
38 | 
  Result := Result + vChars.CharA + vChars.CharB + vChars.CharC + vChars.CharD;  |    
  
以上。  
另,不同CPU支持的指令不同,具体编码最好参考厂商提供的相关手册。
   
 
   |