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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
  Z$ V; d% `9 f( P  P+ |+ u7 V0 j! R2 o9 x
Intel 486 以上的CPU,. w9 v: z# c( B4 T4 U3 R4 E2 N
Cyrix M1 以上的CPU,
9 u3 d6 ~% b4 f( J/ i  s$ PAMD Am486 以上的CPU
. S  [% ^7 ^% b- r" i; [. n$ ?% h$ j) F: I7 Z- l
  (1) 取CPU OEM 字符串, 判断CPU 厂商
) z, ~+ \* ?; O( ~4 ]% ^  先让EAX=0, 再调用CPUID # g. D3 i9 J. F8 E
   Inel的CPU将返回:
7 }) w' n. d3 K! n4 C- J9 J1 l% P6 U4 r5 U$ d
EBX:756E6547H 'Genu'
, w$ U. E8 S' u& `4 M$ }EDX:49656E69H 'ineI'- B3 p$ }- L. q# c; Q# r$ E2 D
ECX:6C65746EH 'ntel', N  e* z. ]* b5 T
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
" I! X! U0 \6 ?% f; W' |4 \9 P
& x. R/ E; o# F3 _; v# uCyrix 的CPU 将返回:( x; ^  G$ E& L, L8 G2 M4 d  B3 Y

9 a( [- S2 D# n3 sEBX:43797269H
# Q! o! m5 C0 f* [- LEDX:78496E73H' c$ w" ^; I5 k
ECX:74656164H
* e' {, }, {, k/ A1 ^" \- q"CyrixInstead","Cyrix 来代替"。
' r; t+ b3 W. w1 P; E/ O- t
2 a3 i' F7 L, x$ b$ M7 I) XAMD 的CPU 将返回:7 h0 W0 f. Y8 D, Y6 {4 H
$ s: c/ u: I/ {5 G
EBX:41757468H% q0 S* C* a4 G; w0 z! T2 V( a1 q9 ]4 q
EDX:656E7469H
8 V. r& z+ g9 Q6 m2 }- sECX:63414D44H: [7 s# L" [0 h! |& {- N
"AuthenticAMD", 可信的AMD。( x  j' P# S. v- k# q

2 p8 X! A4 P9 k0 v7 s+ J! g* h1 M  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。+ e, G' z; A4 Z( r) o, y+ S9 o
% z, Q% h& C6 Q: e
  (2)CPU 到底是几86, 是否支持MMX
0 m: Q7 `% i  h! `" i" D1 c; L" G  先让EAX=1,再调用CPUID   L0 _0 G; Q# \
  EAX的8到11位就表明是几86
" x! L5 U5 Y( m: _6 Y
0 Y+ M. ?, x0 u9 z0 K3 - 386( p2 v4 [8 c* F  G
4 - i4867 Q* l4 b# g/ P. B0 e
5 - Pentium/ z- x: J2 O1 c+ N0 E: q
6 - Pentium Pro Pentium II& p7 V- ?! H/ g. E/ O6 f' u) h
2 - Dual Processors
- ]6 P& D0 K8 i$ L! T) g% o1 {+ v  F. ?1 o
  EDX 的第0位:有无FPU
  Z) b; C0 \5 O6 j' }6 j' g- O* \6 H
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
8 P3 R/ y+ P! ]1 T1 }9 ^( @# M$ m1 _- l9 u) m- d
  (3) 专门检测是否P6架构
, G7 ^* {  T, q' F4 L/ j1 p* r; M  先让EAX=1,再调用CPUID 4 X+ k' g1 D+ G9 ~1 _/ F
  如果AL=1,就是Pentium Pro 或Pentium II 6 V0 l7 U2 ]9 z! ?6 }/ R- {
  (4) 专门检测AMD的CPU信息 7 }; U* D* |2 B% I9 `: \* |- Q
  先让EAX=80000001H,再调用CPUID
& {" i' N3 I1 G$ d  如果EAX=51H, 是AMD K5 % U, u* J5 Y" ~( |
  如 果EAX=66H, 是K6 3 Z5 _# D+ C2 x; \2 B8 f
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) ; I( P  r9 E( n8 r+ S; b2 N6 S* n
  EDX 第23 位,CPU是否支持MMX,
6 f' T6 P- O( g3 B- U) {: b) L0 n; ]( h& |3 f0 Z( z- J9 k5 L; K
  程序如下:3 {% g! `7 k- k

; y0 H5 h6 z  c3 x) V* V# O//------CPUID Instruction Demo Program------------7 K9 r( H1 {( X4 w* ^! f
#include
& W8 q+ Y& @! |+ K7 O+ F: G) P( _$ K/ v#include 8 x9 k9 ]. ?7 z* ^; y6 m, i. d
#pragma hdrstop3 v" K6 [3 z2 X
//------------------------------------------------
+ v# Y; b: u! }3 z/ d$ r+ j+ h/ T#pragma inline- W4 q& D2 D0 \* c0 R7 u
#pragma argsused! _  }+ u4 z6 r
int main(int argc, char **argv)
7 O" Z' P( M4 [1 h5 E{
; l$ Q1 F, X3 a+ Ochar OEMString[13];, \, [3 P. B8 v" |3 |
int iEAXValue,iEBXValue,iECXValue,iEDXValue;5 N' {  a! W# U3 D
_asm {* w1 r5 n; v& [6 l$ q( i1 L
mov eax,0
6 j/ U: P5 d: w! L) Ucpuid9 L0 I# [, t$ u, q+ H
mov DWORD PTR OEMString,ebx. I+ E3 r9 c9 b% A
mov DWORD PTR OEMString+4,edx
1 ?' v: U( W. Fmov DWORD PTR OEMString+8,ecx
) P( o1 g' Q2 k1 |3 S9 m# ?mov BYTE PTR OEMString+12,0* [3 }# o( c) b% i
}8 N0 R1 D0 h/ ^! S7 N" }  |/ E7 [" [
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;- f4 A+ D) X5 d4 b' ]: m6 F
_asm {& o: G3 s+ d6 s: T& L8 J  S
mov eax,16 ?6 O9 A% k; m# m: e" O
cpuid9 U3 x" q. P, w! f5 n
mov iEAXValue,eax6 w) E! T2 F& {) W/ Q
mov iEBXValue,ebx1 Z7 z( L+ a) K$ e
mov iECXValue,ecx% G8 e- q' v2 z- h5 ], c
mov iEDXValue,edx
4 T8 H% X1 X9 V6 O5 b" D- Q}6 v; }# p8 D6 ~" r5 p# G) L; e6 d
if(iEDXValue&0x800000)9 x3 e: _. D* k# l) J, f
cout < < "This is MMX CPU"< < endl;
% `' y) f- n. [3 pelse2 R7 y8 r; I' G8 J7 r
cout < < "None MMX Support."< < endl;
; W( x: G1 K. Y" V" X0 ]; gint iCPUFamily=(0xf00 & iEAXValue) > >8;
% K: L" ]! P8 y$ xcout < < "CPU Family is:"< < iCPUFamily< < endl;  c1 y* d1 S  f1 f
_asm{2 e! y9 J$ R+ d; B4 v
mov eax,2
2 r) L. h; N( c* B- {CPUID
0 u; w( }! T) M) n3 p7 P# t' e}
' U3 v1 B2 k( ]) t  ?! D1 Dif(_AL==1)
- B* P, S' x4 X2 d  o0 Tcout < < &quotentium Pro or Pentium II Found";  X1 ?8 S; p7 H# i
getch();+ `4 \) ^- @" p0 C# {# r! t
return 0;
/ k+ F8 i5 ^2 E) s# U0 Z+ Y}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 11:17 , Processed in 0.036686 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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