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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
$ \2 e: h9 Q. C( h: H. S$ k/ g  ~( p$ x
Intel 486 以上的CPU,& @2 y! H) r$ _" `* w
Cyrix M1 以上的CPU,. t  o) Q  {% z" ^
AMD Am486 以上的CPU2 O: h- }0 t; y" v3 i3 s" q

" _+ n0 f9 \/ n: C, [& _3 ^# U  (1) 取CPU OEM 字符串, 判断CPU 厂商 8 t& B  |( q) o, u0 {6 M
  先让EAX=0, 再调用CPUID
( x3 F1 l: j3 K* }) c   Inel的CPU将返回:
/ L$ N' B1 A% g3 g, ]; ^8 p6 G
* |# E1 h  B% P8 v( xEBX:756E6547H 'Genu'
. I: N% F! w, e' k/ }. QEDX:49656E69H 'ineI'
$ {4 B8 [. G9 J$ ~; ^ECX:6C65746EH 'ntel'
  u% F. V* u9 z" yEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。! y; u9 S3 T6 L- R1 Z" [9 ~
) w. y4 z; H1 m0 @' a5 N1 V1 h; X
Cyrix 的CPU 将返回:; ]6 |# B5 c4 J. r9 M* m& J
) F" m: x1 ]4 u' f2 `
EBX:43797269H% d; z7 t2 [7 M2 `; s7 I( g
EDX:78496E73H
* v1 y) w9 a3 U* iECX:74656164H
% d/ N$ M! D" a0 E' Y$ ]" E# C"CyrixInstead","Cyrix 来代替"。
8 L. u2 M, I9 z7 h6 ^. c- T
3 Z# B1 w) ]2 D0 a8 tAMD 的CPU 将返回:4 y8 b3 I7 I5 [
# `6 i: f: t. A( k/ D
EBX:41757468H2 U0 ~" m/ u# R. U
EDX:656E7469H
9 d1 ]3 A9 r) U1 d5 T. }2 nECX:63414D44H1 @) q! ^# w0 K' n
"AuthenticAMD", 可信的AMD。
. G. [0 B6 g( u
( C9 A" z/ H9 r# E7 `4 N  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
) ~9 g6 N; U1 p$ g; I  B2 x& M6 A1 s6 t9 @8 j
  (2)CPU 到底是几86, 是否支持MMX ; Z2 R0 J$ m3 o. j8 e
  先让EAX=1,再调用CPUID . s  q( E9 c0 e
  EAX的8到11位就表明是几86
) w% [& c" G4 P* N' i
2 g( W8 L+ E0 W3 - 3866 s& i0 M, z0 c7 `# _
4 - i486/ a3 t+ u( g; Q$ W) i( ~# g
5 - Pentium
4 c; O" }5 T5 L6 - Pentium Pro Pentium II- L8 I  Z- Z3 |# R
2 - Dual Processors. Y( ~. `, b) R" }9 X

" z$ S. V  a$ Q3 j( x! k" ^% L" q  EDX 的第0位:有无FPU0 {, k: `" a2 P) C% ~/ u

# @$ b* ]2 i' ^  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
, N/ t; n. e7 w. C5 z% v8 e% F% w" C' B1 |  w% b. |, O# n
  (3) 专门检测是否P6架构% {5 @4 e- {# `8 v  [% o" Q7 [8 L
  先让EAX=1,再调用CPUID
% n& Q6 [6 g" [- u1 z  如果AL=1,就是Pentium Pro 或Pentium II
4 Y- `0 c% q5 f3 g! R$ ~  (4) 专门检测AMD的CPU信息 % P4 F% b9 M; ?! ?
  先让EAX=80000001H,再调用CPUID - g8 g. O0 [0 o8 F! V
  如果EAX=51H, 是AMD K5 5 N& t" C6 k# g6 e3 ]' v7 I7 h  m
  如 果EAX=66H, 是K6
1 W5 n$ o8 o$ u7 W6 r  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
+ [3 v/ K4 M; g. E. Y$ g  EDX 第23 位,CPU是否支持MMX,
: d1 G3 v3 x& @/ J1 s/ f7 c4 m. {
2 t2 X5 E  C) i  程序如下:" a4 L- ?" d& y3 X% c! z
  h2 C1 C4 s& |& G- T$ W- P( N
//------CPUID Instruction Demo Program------------4 V2 i+ g+ \. a9 t: H. {' O
#include + y. Z& g- o* b6 Y  a* V
#include   n3 w6 T& W$ A' N
#pragma hdrstop! C, B2 m. P5 k& M9 E  R
//------------------------------------------------
- V2 f* ]! x# |" w/ {8 `' o#pragma inline
  k3 ]1 A- Z! U# R0 {# U; u#pragma argsused
. \4 h; E! _6 |2 X9 Qint main(int argc, char **argv)
* P) z( h# m% ~* S{
# ^5 P: u" w9 V4 }char OEMString[13];
4 g  S; x) g# Kint iEAXValue,iEBXValue,iECXValue,iEDXValue;. O2 p! x3 U1 t) F5 h+ z* Y. o' q
_asm {8 n; I/ W) r) [, j# N# a
mov eax,0
- x; g7 U6 B: }  p) h; Z  A# zcpuid$ j! L' [* T0 \/ u# c1 f
mov DWORD PTR OEMString,ebx; t1 Y& H& I. \+ u
mov DWORD PTR OEMString+4,edx2 w2 x6 y* s( M3 c& w) p
mov DWORD PTR OEMString+8,ecx
; ]7 Q# D" Q. Q# k! |mov BYTE PTR OEMString+12,0  K! J6 p- u$ l8 m% s
}
1 g) @9 z( X8 |cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
3 }" N5 H9 ~6 l* r_asm {
9 i8 X+ p( A) P9 |$ G$ Wmov eax,10 a, X: Z( \3 a% t, N5 H* q* D5 Z
cpuid$ N) o" O: C" E' c8 c9 U
mov iEAXValue,eax
4 s/ _5 A2 t9 a6 {2 e7 x! |mov iEBXValue,ebx
. X3 l% P! v6 z, J' G8 T. umov iECXValue,ecx
* a8 v3 Y7 h- J0 C/ J. `6 }  ]mov iEDXValue,edx
' J4 s0 `" C. f4 C}& E' f$ b! g5 a9 A: h
if(iEDXValue&0x800000)
; D% p0 a6 [/ Z3 v% c8 ecout < < "This is MMX CPU"< < endl;
: k, @' u' W" }/ N2 X1 ~0 jelse
1 c' G0 R. b1 ^6 h( c# J0 ~cout < < "None MMX Support."< < endl;5 @! l5 [: U' N" p, V
int iCPUFamily=(0xf00 & iEAXValue) > >8;
6 T0 [2 y/ d+ I) Ocout < < "CPU Family is:"< < iCPUFamily< < endl;
5 p% j- z' J3 y# D7 F$ \_asm{8 |4 Q' n6 C2 r( r8 o7 [
mov eax,2
7 m" c& o& y$ A- H' R! PCPUID$ v0 W% E! B& [/ ]0 \8 J/ T& L
}
( |0 Q! S) }! W$ d3 a+ c3 Qif(_AL==1)
- j& i0 V" c- a0 ]2 Vcout < < &quotentium Pro or Pentium II Found";5 Z( h, A" w$ ^& g! Z! z: K
getch();* e7 `6 o% A- N. d* J  D. N
return 0;  F3 t0 G4 z& q6 I: k
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 15:58 , Processed in 0.038574 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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