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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:* k8 G3 Z' g* d. S: X* w  ?

9 C" a# m# I8 I; k+ I( t# |( YIntel 486 以上的CPU,
! G2 ~- l; B1 X. B6 B0 vCyrix M1 以上的CPU,
) E( L, Z. L& P' d0 ]AMD Am486 以上的CPU
, L  W$ K, X# G2 H6 {% X
. f; x: y" ~5 Z, t, W' Z: o2 ^, ^4 z  (1) 取CPU OEM 字符串, 判断CPU 厂商 9 O  h0 o+ s" o8 U" T( z' [3 _2 ~
  先让EAX=0, 再调用CPUID
$ ?' l6 Q8 }, f   Inel的CPU将返回: ; k) X* _! Y2 F/ [2 j# O: S
: h+ S# n0 h: m1 D, I* V; t
EBX:756E6547H 'Genu'" {0 f, t2 L4 s7 z
EDX:49656E69H 'ineI'% v4 c& b& A; y% u6 c$ N. B/ k% l
ECX:6C65746EH 'ntel'
4 h+ Q! }, r. H7 q$ CEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
* Y4 }, ?  [! K& ~+ U$ Y- ]0 U
# Z$ m1 c4 b7 g: I, F% l& eCyrix 的CPU 将返回:: a! a" |; ?" b' y# d  i. s; Q7 Z

. d; a# s' i7 u& d6 |1 bEBX:43797269H" a5 H3 F- [: D. K0 A
EDX:78496E73H
6 ^" Y/ @0 g8 t7 T$ q4 eECX:74656164H" j  v; y5 i4 u. C5 e- X
"CyrixInstead","Cyrix 来代替"。
4 E" X+ E) Y- N( ~( r4 J: B. H8 K% I
AMD 的CPU 将返回:
" ]4 B6 T- b8 l" Z% J
( U5 j1 W2 Q8 t0 V8 ^+ S( {+ E, v' a7 nEBX:41757468H+ p+ F  ^, M4 B8 N9 _" j, l/ Z
EDX:656E7469H
' z- z: Y, R8 n3 C) N4 x/ h: P' ^) wECX:63414D44H
0 M% Z& ]# L5 T"AuthenticAMD", 可信的AMD。, G; M& y% h) |1 l) ?- ~
' l1 X1 K  \9 f" Z" k
  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。0 K6 ?0 Y! y/ j1 U3 l4 ]* a& V
% f% P9 S4 j& [& ?' U8 M/ K/ K5 Q
  (2)CPU 到底是几86, 是否支持MMX
3 [* s9 H# x: u  H/ e# X% t# f  先让EAX=1,再调用CPUID
. F! V; s# ?. ~  EAX的8到11位就表明是几86 : u& z, ^! X2 \6 ~, g9 S4 I! ~

: J% N: n. J' c( v9 {- |3 c5 ~& F3 - 386
' A& n) e' h+ P: }: p6 e& b1 h! K4 - i486
( ?& _2 t3 \9 L$ r  H% w0 O/ m5 - Pentium0 B  t, @- ^6 R5 A
6 - Pentium Pro Pentium II
7 `+ E3 _/ q- l2 - Dual Processors  v8 x3 _0 X5 h, w4 |: C
  H# ^4 j; U. Z2 U$ g
  EDX 的第0位:有无FPU
  I8 S+ m$ t4 c* J8 _; j
) }+ H1 v) E2 ^$ J  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 2 g: J& N+ h' h/ G& h

2 H3 [) H( r  Q* E9 `0 V( Z2 L5 I  (3) 专门检测是否P6架构
  a$ ~6 o$ M, L: z  先让EAX=1,再调用CPUID
1 G' M' h- M" D6 R7 `+ I4 r* S  如果AL=1,就是Pentium Pro 或Pentium II
$ Y- ?' U: \3 ^4 |/ G: \$ |  (4) 专门检测AMD的CPU信息 ' }) U9 c5 ~4 @0 W, s
  先让EAX=80000001H,再调用CPUID
' o/ c# b/ D) D& ?: o- u% I! e" ^  如果EAX=51H, 是AMD K5
$ [: I0 h! p  m  如 果EAX=66H, 是K6 3 @4 z" v  Q! L( D7 c* a
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
# N; U' {) ~1 |% e  EDX 第23 位,CPU是否支持MMX, ) G. B  m( C: e( |

" k( l4 Q- w' s# F  程序如下:
, e  J" g, a6 c4 y1 b. j; Z8 q1 }/ a7 q% o
//------CPUID Instruction Demo Program------------
& E4 ?* P6 y3 u: @1 ]& Y; s#include & k5 J0 C2 K* x/ u
#include
, `1 @0 f% x1 _! W! {7 R#pragma hdrstop
0 K- M' @. W! K: r" l3 ]//------------------------------------------------
* g: b4 X. ?( O. |. P' @#pragma inline
2 x7 {* l) o3 m3 `9 L1 K#pragma argsused( a2 \- H4 [* R7 y" a9 W2 i4 W
int main(int argc, char **argv)
; x9 y% m& y0 |' r{( Z" I) u$ M7 K6 r1 y
char OEMString[13];8 h6 u# j6 W0 m$ F) m
int iEAXValue,iEBXValue,iECXValue,iEDXValue;5 E  ^: X$ _9 f$ o
_asm {$ `/ e( L+ e  G; I) H
mov eax,0
! u9 O0 \# y( Z3 y% jcpuid
' D) U0 A, B7 j/ h7 j+ x: E3 o4 l/ imov DWORD PTR OEMString,ebx
) M  p7 ?6 |/ ~9 J9 m1 A  n, [3 Hmov DWORD PTR OEMString+4,edx* j7 B4 y' X8 X5 ]/ d: o' Q: j! v
mov DWORD PTR OEMString+8,ecx
& X+ Z: U. U) P* rmov BYTE PTR OEMString+12,00 h6 `- r# l' H- M
}! z# h- R3 r  s9 f; t  f8 O! N& d6 W
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
( w  V) c+ [' d& ~+ O_asm {
! H; o2 I" W! C; T" Y6 z5 X+ Omov eax,1& I/ k4 Y2 \; q4 \3 S: [/ i
cpuid- B; P2 v( n% [1 M
mov iEAXValue,eax
( H: a9 [+ K3 z9 A' Hmov iEBXValue,ebx; q3 V! U$ I+ N* Y
mov iECXValue,ecx7 [7 L$ X! q( ^4 H) A
mov iEDXValue,edx
" y) T1 A+ a2 a* k}+ G* J0 I+ Q- s/ |+ {
if(iEDXValue&0x800000)
0 U0 I2 Q# v) d2 n: ?+ C. scout < < "This is MMX CPU"< < endl;
/ m6 E" e7 C. l& kelse
6 b  m( ~8 R0 E7 }cout < < "None MMX Support."< < endl;
4 Y, j' D& _. A+ f) J+ Qint iCPUFamily=(0xf00 & iEAXValue) > >8;
. f9 d# V6 t4 ~* V- e/ I- qcout < < "CPU Family is:"< < iCPUFamily< < endl;& C* [# ?9 ^3 Y! B* u# \
_asm{
) o2 f( ?. s5 S0 j4 t& E  E3 gmov eax,2
# S  q. U& K: J( y  _, s+ oCPUID0 ?( r/ `; z5 f% E: b! |
}4 v/ z) a& j/ B& F/ ?
if(_AL==1)
! A4 d3 T% `) R, Lcout < < &quotentium Pro or Pentium II Found";
2 X, Z  y% C% d% l! h6 J6 |getch();2 |/ S7 G! C% f6 S
return 0;
  T: L& Y3 Q, x0 v}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 01:43 , Processed in 0.019402 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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