找回密码
 注册
搜索
查看: 4053|回复: 0

[收藏]使用VC++取得CPU信息

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
, K" o8 w0 \4 H5 x+ x7 O
/ h: M2 ^. w9 `; zIntel 486 以上的CPU,
' E+ J( n7 E. A5 q: M5 a. sCyrix M1 以上的CPU,, a* I! r: y# w2 `
AMD Am486 以上的CPU: i) n# O5 Z% j% P
( C. e: R  N7 H& Q3 V
  (1) 取CPU OEM 字符串, 判断CPU 厂商
& c2 b& E# ?5 n8 j, m5 O1 b8 c" o  先让EAX=0, 再调用CPUID 4 B# s- B3 @2 \% P
   Inel的CPU将返回: & @: `" k$ ^* T4 |' G
% Y2 X7 _; [5 B
EBX:756E6547H 'Genu': g$ h5 i, \" @6 e) H" P/ O
EDX:49656E69H 'ineI'" d+ S6 W9 Y, U$ y
ECX:6C65746EH 'ntel'+ a% G+ R- c/ S. I( Z
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。; O' \; g( a' [2 `" C" |( d
; e$ I/ W4 U# a" s& j5 q2 V( K
Cyrix 的CPU 将返回:
; d# r8 P( D& r
' _- B# @8 `4 ^7 \/ Y4 TEBX:43797269H! Z3 c6 ^# Z6 k* {3 r- v9 j
EDX:78496E73H
. i# i5 ?% e/ C) o0 v4 v0 |ECX:74656164H* X4 U& \# \8 E2 J* L( G: I8 i
"CyrixInstead","Cyrix 来代替"。4 L" Q  X; E" D
: ~/ P$ l7 ~7 i, ?( j7 w* V0 ]
AMD 的CPU 将返回:
$ v/ u" [. {# ~# Y7 M3 F; A+ W) |4 ~! e5 r6 z; R4 R2 X
EBX:41757468H
* [, [% x4 a' ^: jEDX:656E7469H
" m/ m% \# l6 ~( p5 yECX:63414D44H* @4 L& c( V0 m3 v5 V' N, B0 [; r
"AuthenticAMD", 可信的AMD。
. }8 M2 K$ [6 a  a" ]+ Q4 L0 C9 L+ i& k& `# q
  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。$ r' @$ _/ h4 X% }! P% ?7 k

0 S! w3 ?! b* {( [  (2)CPU 到底是几86, 是否支持MMX
9 V2 Y' x) t& a' _  先让EAX=1,再调用CPUID % {$ a2 I& z/ K) y" V4 \8 y9 d
  EAX的8到11位就表明是几86 % ]- x3 T' ~9 c5 B6 d

! S0 M+ D0 R2 S8 O& }' q3 - 3862 J; |2 u* f7 j! V
4 - i4862 y8 V6 V+ W" L: v' \' g
5 - Pentium2 ^' V6 B  |' K) W
6 - Pentium Pro Pentium II
. e# \. H( }; r2 - Dual Processors$ A8 G2 J7 L# R, z" G/ ^* O
7 P4 B- ~0 u: M( f
  EDX 的第0位:有无FPU. g  S$ g% ~1 ^; [; Q# b# k( E$ M: [

4 n/ `3 ~7 `+ L0 }4 l- _  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
  o2 O# ^- {1 N
; s1 V# c' X; U, t4 f) w  (3) 专门检测是否P6架构  A+ G9 i2 v) p  B7 P
  先让EAX=1,再调用CPUID
/ j/ u7 Y! V/ w0 N  Z5 [: `: B  如果AL=1,就是Pentium Pro 或Pentium II 5 s- O6 [# g) Y5 T7 m$ B
  (4) 专门检测AMD的CPU信息 " e' [3 J' J( Q
  先让EAX=80000001H,再调用CPUID . B" |# h+ ?# [  X  K
  如果EAX=51H, 是AMD K5 / B. O3 z  `& b( }0 K
  如 果EAX=66H, 是K6
6 u) Z% a; |+ ^8 p- [: ]  {  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
5 `: n+ R' K6 _: z  EDX 第23 位,CPU是否支持MMX,
6 w6 [! _" l5 ^$ \% q, g/ f" w0 ~1 P! p2 ^$ \4 U$ i
  程序如下:8 Y7 k" Z$ ?4 F- _1 `

( |+ T6 ]* H  [0 f; W. g//------CPUID Instruction Demo Program------------
* p, l! x; v$ `4 _2 w9 h#include
$ X: V& L, B, j3 A#include 1 x% ?* R- Z; X! ?- j) Y
#pragma hdrstop+ H9 D& h. e" C+ S# `3 b' ?" ~
//------------------------------------------------5 r2 F3 Y1 k9 P% p3 U1 ~( y
#pragma inline5 I/ n+ T' u/ m
#pragma argsused+ j& U' F' |* U3 f7 s
int main(int argc, char **argv)
5 D2 O0 A$ |- N+ O{
; q, I/ Z6 m" n& S; uchar OEMString[13];
, B" a! f0 A' nint iEAXValue,iEBXValue,iECXValue,iEDXValue;* K6 o& J, g) r
_asm {
2 H- r3 `' h/ Nmov eax,0
% D1 K  l6 x" \; Bcpuid
* V& M9 b2 ~, O' m, a( Dmov DWORD PTR OEMString,ebx
6 i4 X% L- V) F( T# Rmov DWORD PTR OEMString+4,edx
. ?; Z7 u; b# |/ Omov DWORD PTR OEMString+8,ecx  M: z; d1 s; e, M( a
mov BYTE PTR OEMString+12,0
5 i. z2 u! ?: B8 l1 _! Y}+ m. u, F  [; P& |
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;' L" R! |+ W6 I- z, B2 Z, t
_asm {
! f/ \$ x3 F7 ^; zmov eax,1
; L( D9 w0 @4 a( D3 b% Ycpuid3 a: N' q5 \0 J$ ]
mov iEAXValue,eax
" J1 \6 N2 V* o: l. c6 E' U! d! @mov iEBXValue,ebx
  \& ]- c2 L8 `mov iECXValue,ecx, \, @" {. E0 B0 }  L7 V( Z
mov iEDXValue,edx: d+ V0 O  g" v
}; x: o& Q% G! |% y/ |
if(iEDXValue&0x800000)
: T4 K9 e' ^  i. x* |: A. wcout < < "This is MMX CPU"< < endl;2 @! t( R+ I0 Z/ z' L5 M
else( N/ W" \4 D% E" I% G
cout < < "None MMX Support."< < endl;  s) d8 V, y+ u, r0 k6 W
int iCPUFamily=(0xf00 & iEAXValue) > >8;
6 z, F, ]* R/ Vcout < < "CPU Family is:"< < iCPUFamily< < endl;) Z6 A, P: c3 V+ e: p! }1 j, M
_asm{$ b# N3 e9 _+ e" Z0 [. ]
mov eax,28 A( F+ V; H" \" X4 a3 h
CPUID
9 W2 a- c6 W+ l/ ]  R; G}' z4 a' W0 ?7 A5 l
if(_AL==1)1 |7 V3 _3 h6 o0 o# f9 c
cout < < &quotentium Pro or Pentium II Found";
4 R/ O' e3 o5 N( N' e4 G/ b" }getch();! a# o( ]0 |: M2 I
return 0;& U( ]& d! @+ |3 n4 E. V9 B
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-8-9 09:35 , Processed in 0.035963 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表