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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:1 G2 t, s. j2 f; F* [
+ b& B0 A% t$ c( R8 N6 |# x
Intel 486 以上的CPU,' i7 V, u. F6 D& s
Cyrix M1 以上的CPU,  A3 Q: I  W7 \7 e1 N$ ?
AMD Am486 以上的CPU
& s* [4 N1 I( p5 U0 ]2 r2 U' B2 G/ P& ?# M, U9 T& F
  (1) 取CPU OEM 字符串, 判断CPU 厂商
3 Q* Q" X0 Q2 ]) e  先让EAX=0, 再调用CPUID 3 I' G1 y" p. s% `& a) J9 L: _  i
   Inel的CPU将返回:
$ z0 y) G9 R6 }# H7 s
  b2 D# S* R7 y1 S7 R$ H  t# HEBX:756E6547H 'Genu'- X/ x! H. F5 T$ a8 w9 Q$ g' q" u
EDX:49656E69H 'ineI'& ^7 N+ Y; S1 s! a$ a' H
ECX:6C65746EH 'ntel'; c# B% s$ }( F. K1 B
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。+ N: m9 l" s0 x* V* c

/ |9 F2 b, j* ^, z+ d9 tCyrix 的CPU 将返回:# @# \' ]1 d. o! w; |

# E- G+ E/ s$ Y; r5 O  fEBX:43797269H
0 Y9 V) a! J. p; E4 d# i- nEDX:78496E73H5 h6 }9 c) u6 R* ~3 q$ L! `
ECX:74656164H# U3 F; M- L) }; z
"CyrixInstead","Cyrix 来代替"。' U/ \  c. ?# w$ s  v8 R
5 L! r' U9 x, B1 x! q# M- r
AMD 的CPU 将返回:' O4 }9 i4 }# h6 A3 c* W- p5 L) K

& p+ t" |8 x4 {* R" `6 Q/ Y% w% TEBX:41757468H
+ c1 D8 q2 h- [EDX:656E7469H
3 @% q+ h9 A7 Q8 j: }) P: tECX:63414D44H9 o* \- s' q2 d: c- C- X4 s
"AuthenticAMD", 可信的AMD。: f/ W+ \+ \  @% k" C# I% U

. z- |  O9 G: K- p' Y  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。6 O5 Y( }2 {; b6 C/ H* p1 C  e; P
2 H" l  F- R, n: {
  (2)CPU 到底是几86, 是否支持MMX
1 z- p! u% g. {1 |) p# w  先让EAX=1,再调用CPUID
! r1 S+ t9 u- f  EAX的8到11位就表明是几86 " s1 Y- q& K2 M7 y5 [, l, M

) {5 P3 h$ ~: [  x3 - 386( G( W; O0 c5 h- t8 N4 y
4 - i486$ h6 z' [" \& e9 }
5 - Pentium; E& r  F6 ^) n8 M2 x. C
6 - Pentium Pro Pentium II
# M5 S; Y; D, }- M( i% P# M2 - Dual Processors
0 F& S. o& O6 T/ y# M6 R& v; Y0 _: }
4 t$ f: B5 Z4 l- M+ t  EDX 的第0位:有无FPU3 ^6 F, a0 M) S
; A# M9 i, M" L; G+ c$ k( H! o1 y! p; f
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 ; C% A/ F4 ^4 E

5 u. g( ^7 o7 q1 M8 e0 c  (3) 专门检测是否P6架构+ D" G3 ?; C- n0 J& @! c4 e
  先让EAX=1,再调用CPUID : z) i4 X- d0 W. x# o) x
  如果AL=1,就是Pentium Pro 或Pentium II
! a0 M7 q# w& H& j0 j: U2 ]2 ]  (4) 专门检测AMD的CPU信息 3 ~2 p( o: ^" q5 O1 `
  先让EAX=80000001H,再调用CPUID ; _; n- ~/ B# v6 S8 L
  如果EAX=51H, 是AMD K5
% i6 y* y, q2 c! a0 V6 a+ H$ P0 Z% m  如 果EAX=66H, 是K6 : w1 l) n' E% f5 n% \6 {/ n
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 0 R" k8 n& p0 Q" G% o6 _+ h. F
  EDX 第23 位,CPU是否支持MMX,
# q, M6 F4 S0 x1 S7 a
$ K2 l' O! Q/ q$ R# E: x' v) y, c& Y  程序如下:
, O! w1 X- k9 b3 Y
9 h% h1 r6 l) M//------CPUID Instruction Demo Program------------, P- B: K& `5 `: U
#include 5 j" \; Q5 ~* X5 F
#include
* K" Q; \' H5 ~" Y" \" i* x6 B8 o#pragma hdrstop
; ?) J0 Q  Z0 V$ C1 `//------------------------------------------------
8 D' p; Q. V  l+ e* O+ `$ B#pragma inline! D; S, ^7 }) g; x3 c% c$ ?' z
#pragma argsused
$ \3 z& O+ U! w  g) C9 H& \- Rint main(int argc, char **argv)
! L! W' O  G# w: G{
2 v: i4 z  Y4 {& w3 P7 ^1 }& nchar OEMString[13];
1 F3 ]* B0 V2 j- D+ }int iEAXValue,iEBXValue,iECXValue,iEDXValue;
- t) d' _: R4 ]; S: Y, V" n_asm {3 i: a7 I; d* }+ I) v; `
mov eax,0
* K+ A% {; n; ?cpuid) L. r4 ]5 B! W0 w: e
mov DWORD PTR OEMString,ebx
9 I7 _: i) n0 n9 Kmov DWORD PTR OEMString+4,edx
* M2 {6 l" a* }9 ?; \, V/ emov DWORD PTR OEMString+8,ecx
" z* f: D8 I  l& Amov BYTE PTR OEMString+12,0
" n1 ~! K- P8 g' a4 B* e" O}
  I1 e; H/ p1 N# m& pcout< < "This CPU 's OEM String is:"< < OEMString< < endl;
: T) Y% y  N! I9 X9 Q4 M7 f_asm {( D+ Z# v' ~$ Q
mov eax,1
) ^& p+ e3 @5 v( Q8 vcpuid
+ m# k' q! V; n: ^mov iEAXValue,eax5 O( M* Z/ ]; z/ \
mov iEBXValue,ebx% d6 H0 D7 l8 f+ X3 `9 U- H
mov iECXValue,ecx) Y) p+ C! z( R
mov iEDXValue,edx0 v5 n  W9 R1 k9 ?. J, D
}
: j( E. n; C" W) y2 c! ?if(iEDXValue&0x800000)
9 l! [2 V  I: x; H+ V* V/ g6 v: Kcout < < "This is MMX CPU"< < endl;
7 {- c( U( J4 y2 telse
1 I* Q  @. n+ j, e5 ncout < < "None MMX Support."< < endl;
3 }0 G. Q3 c# S+ d2 a9 h: Aint iCPUFamily=(0xf00 & iEAXValue) > >8;
0 I% W( j0 Q$ ]% ~cout < < "CPU Family is:"< < iCPUFamily< < endl;4 h- Q+ y8 {; I# G7 M9 s( c
_asm{
' O- N! K8 Y- G# ^, u- W* H. O" Zmov eax,2
: ?. ^% K: K3 C5 E/ DCPUID
/ Z- r- v5 n& E8 Y- Q0 j}: W; R: ~2 Z& Y
if(_AL==1)
9 I# v2 i$ n4 p- |# pcout < < &quotentium Pro or Pentium II Found";2 X' a2 j1 H, O0 q5 j
getch();
. V+ v" Y( K8 {/ E+ kreturn 0;* D. ~  `- ~; U3 s) I6 A  a' q
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 00:52 , Processed in 0.020359 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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