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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
* B3 ?& \0 w5 o
6 ~# Q& q8 _  M( G0 N. M" UIntel 486 以上的CPU,( z! @$ I: h- s) v( g+ b
Cyrix M1 以上的CPU,# {6 n7 Q: x- |# i
AMD Am486 以上的CPU% G0 P, U) y9 q' T$ [

( E1 L' A- G2 L' y0 q9 W- n* X0 r& N. y( P  (1) 取CPU OEM 字符串, 判断CPU 厂商 - [+ U# ~3 M4 n1 V. R
  先让EAX=0, 再调用CPUID 9 k% D/ T1 x5 o0 X- M1 F9 `/ H, J' d: @
   Inel的CPU将返回:
4 p3 g' Y; A- q+ {* d8 ]2 x5 O* t
EBX:756E6547H 'Genu'9 y0 V* T& }4 T* D( j
EDX:49656E69H 'ineI'6 U5 K7 c1 h$ d( k1 `
ECX:6C65746EH 'ntel'
1 _2 p0 ^4 C3 x3 z+ KEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
7 Y2 Z: R% t/ y: q5 A8 b! J, \( Q" A. E, q: M7 b; s
Cyrix 的CPU 将返回:+ F  y2 u' ~1 ~1 U/ R& h

1 Q' h  z' S: h+ z9 w' eEBX:43797269H5 e. J  L! |# N$ V) ]/ O* i3 Z2 l0 L
EDX:78496E73H5 G$ N/ s7 q8 q! R
ECX:74656164H+ u. N# x) F* V/ ~
"CyrixInstead","Cyrix 来代替"。
" i# J+ }- N1 h/ f" G7 S% m. h* q. B' x) K% \
AMD 的CPU 将返回:. K2 a6 L7 I* i1 g
) a( n( T, m9 m5 h1 B
EBX:41757468H  \4 n( d5 O8 L+ E/ _# ~. `
EDX:656E7469H' [7 ^4 E2 P" S  E
ECX:63414D44H
1 w  {5 a4 g+ t2 y, {( ?4 n2 G"AuthenticAMD", 可信的AMD。
2 ~; {. c: f, U6 q1 J8 C
* M+ k. G5 S" b1 F9 P' q  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。7 F5 r- l) F2 k  X: E  y; ^
4 E" ~' Q- e( g! s( p: ~+ w& e
  (2)CPU 到底是几86, 是否支持MMX
- o0 E6 s- d9 a4 `  先让EAX=1,再调用CPUID
- q/ {( U1 I1 ]: ~: I0 x2 O  EAX的8到11位就表明是几86
2 V. ?* a( R. x' |
  r6 H5 A% X) ?% A' Z  G3 Y3 - 386
5 }+ p4 H2 Q& x( ~$ L  J! p4 - i486
/ q: _2 |' W" ?% N" w% e; i5 - Pentium3 Y, q# {4 ~* H) e6 K  g
6 - Pentium Pro Pentium II* ]& C& I' P! H3 q5 j
2 - Dual Processors
: v, M+ e1 \  p( T8 \  D5 E
" N1 b3 ]! m, k( U& M3 k' F5 M  EDX 的第0位:有无FPU
9 u7 B8 q. ]* J6 B0 x2 W1 D  v# B5 ~0 q- K6 v' j) ~" c
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 ! U# ]( ?- q, k& `2 g8 ^$ a

5 F7 o& L; M, q1 W  (3) 专门检测是否P6架构
: Y9 F* O* _+ e2 a* }  先让EAX=1,再调用CPUID & @, v( I9 A, D0 V( e+ U8 p! }
  如果AL=1,就是Pentium Pro 或Pentium II ' d' x" L! P: \
  (4) 专门检测AMD的CPU信息
9 k+ o; Q" X5 C9 v3 A  先让EAX=80000001H,再调用CPUID 9 s  }8 X5 X; C' O7 x8 M
  如果EAX=51H, 是AMD K5 9 V- }. c: T) T9 j5 R
  如 果EAX=66H, 是K6
) R0 B# O7 S; w8 d  X1 J  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
9 U3 P. Q2 j- ~  W+ G) c  EDX 第23 位,CPU是否支持MMX, # P! n' P& U# W# z* ?! P5 t. {

) `2 q& w/ V) A  f- n! B8 x% [5 @0 C3 U  程序如下:! M6 o: H: e. {' D6 _
" k* L6 F7 P6 R# d/ j, P( ~
//------CPUID Instruction Demo Program------------
$ V: G! ~2 L( l$ Q/ \#include
7 q; q6 H1 a; T7 e1 o& B) V#include
6 h5 d9 |( o7 o, Z  \, x#pragma hdrstop
& G5 n" C# }5 W( ]9 m3 }6 x1 F//------------------------------------------------
( M3 r& R+ \3 b  t# G% a#pragma inline
$ v/ I) c9 o% e* t# ]9 c7 t9 L#pragma argsused
' i* b0 F4 l. Rint main(int argc, char **argv)
  p% `! Q4 R  \+ t{
6 i8 k' Z, C6 K5 F# Qchar OEMString[13];
& d2 U# }1 F" M* u1 u- B7 z# Bint iEAXValue,iEBXValue,iECXValue,iEDXValue;
* ]: L* w$ C$ U2 m  x3 v% _. ]% s_asm {4 {" f( S; ^5 ~
mov eax,0) R; Q, F) ]2 t$ K0 U8 A! G
cpuid* O/ {$ T, Q5 o9 ~( q) U
mov DWORD PTR OEMString,ebx
: L5 `. {/ a' v7 gmov DWORD PTR OEMString+4,edx9 E! E' H8 t# K5 h& m+ G% ?, [
mov DWORD PTR OEMString+8,ecx8 K3 ~& _# g/ @( {
mov BYTE PTR OEMString+12,0& T, H2 h0 H+ t% m( w$ W4 v
}+ h5 Z/ y) g+ j- y! ?$ {$ @
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;* ^' `' z9 n2 u. f1 |* Z3 L  X
_asm {
: a3 _6 H. L( qmov eax,1
7 L4 t  H9 M6 L4 u, H& Ocpuid& q$ t$ d3 Z- A+ P
mov iEAXValue,eax$ x, c$ q7 x/ `3 s  V
mov iEBXValue,ebx
1 v& O. ^0 n4 U" S$ S" Zmov iECXValue,ecx& [8 @! }+ Z6 d+ {4 @
mov iEDXValue,edx
: r) \) C0 k' p8 f  }}
" z2 `' ]; {3 Y- mif(iEDXValue&0x800000)0 ?1 S4 Y2 N8 \2 }; r' ^
cout < < "This is MMX CPU"< < endl;
# _" X$ ?9 A/ j' ?else
- d% X2 u- h* F% R3 Y$ D; e( G5 G8 i8 pcout < < "None MMX Support."< < endl;
$ |0 z, N: g! ]1 Q3 Rint iCPUFamily=(0xf00 & iEAXValue) > >8;0 L  c# |1 z% M. S* \( Z
cout < < "CPU Family is:"< < iCPUFamily< < endl;6 w+ r1 ^+ @) L; U4 R0 `
_asm{( ]! t9 f% ^& ]4 R* r2 ^% w
mov eax,2
6 J5 f1 r& E5 M; \CPUID3 K. K& Z% i- v, [) [* E1 {8 P
}
% T, u3 j# E3 i1 L6 f2 ?7 _& a+ G- Yif(_AL==1)! f" B2 g; d: m8 x/ W: ~
cout < < &quotentium Pro or Pentium II Found";
# ]$ t. c0 C+ F" Igetch();& `6 p+ h4 \/ T+ O" t
return 0;$ e6 [4 F2 s( b5 w# z' w
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:19 , Processed in 0.017942 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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