Delphi下获取CPUID
发布时间:2013年9月11日 作者:未知 查看次数:2547
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支持的指令不同,具体编码最好参考厂商提供的相关手册。
|