找回密码
 注册
查看: 4582|回复: 0

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

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

8 x- J4 O" x. K' d1 aIntel 486 以上的CPU,
/ d# u$ x2 X" a- K& [Cyrix M1 以上的CPU,$ p! F6 z1 Y! ?
AMD Am486 以上的CPU& N& O0 `* T" k5 R; w

: r8 M, _; x1 M6 q  (1) 取CPU OEM 字符串, 判断CPU 厂商 & `0 l& s: \" q% J5 q
  先让EAX=0, 再调用CPUID ) L- _0 Q. m6 i: g! ~2 {
   Inel的CPU将返回: & D2 r* ?: Z" A- f( f2 e" O/ N# M
; }' d; N) W$ [% D6 n3 F6 _
EBX:756E6547H 'Genu'
- Q, c8 U7 Z  O  I5 M( l& A* XEDX:49656E69H 'ineI'
/ Z, l0 V% G5 a* p+ yECX:6C65746EH 'ntel'
6 p7 O+ o9 b) XEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
. [* J3 r* ?( j1 c4 r3 w0 m8 _$ m3 \' f" L
Cyrix 的CPU 将返回:
5 \$ ?' d- o1 L/ N; K( S- {# A  z6 e# A
EBX:43797269H
% ~1 K! H& W1 |% O0 r% dEDX:78496E73H
- A, j7 l2 o$ }) {2 [ECX:74656164H
  r8 D3 l/ b3 P/ p) p"CyrixInstead","Cyrix 来代替"。
, y4 _) d9 S" Q3 w0 ^; _3 P* d9 `: e4 V# H3 y$ ~& K
AMD 的CPU 将返回:- Y/ T2 [0 ]) |

5 Z0 Q* k. G* MEBX:41757468H, v" Z1 o% H3 v
EDX:656E7469H6 z; v3 I* ]+ }; s2 }
ECX:63414D44H# J( l5 q: h) t# a) A
"AuthenticAMD", 可信的AMD。+ ~5 V2 N! h3 Y+ N- z
  V5 m( C" M( Q. {! L
  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
! t. ~& F. a1 D# ~
) ^$ a: n; `9 A5 Y  (2)CPU 到底是几86, 是否支持MMX $ T0 B+ W" G) t
  先让EAX=1,再调用CPUID ) B1 ^) j, Y: z& |% N2 }8 d2 u) {
  EAX的8到11位就表明是几86 ; C, c% I3 N  Q( r) G6 C; r) ^

/ N' D2 X+ O0 y/ j6 O" _! {3 - 386
3 ^* ~/ o' q6 }4 - i486
3 Z# V. I" K2 ~- q5 - Pentium
1 q! D! T- }7 h: t* p5 f& c$ N. h6 - Pentium Pro Pentium II% }0 n4 {! I# F, M+ e
2 - Dual Processors- w2 R( P& O  Q/ K& I
1 M! A8 E( n8 L( l
  EDX 的第0位:有无FPU
6 G1 B# p: G8 Q" T3 y6 D, S, W1 k3 }
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 $ Z- D: Z3 L- i7 a0 t+ M: P* j+ i

% C* q5 e! s. d0 [/ Y* h% W; F  (3) 专门检测是否P6架构
1 D% S& b" A: t+ c* X  先让EAX=1,再调用CPUID
4 S" [. K( m6 r& p+ m  如果AL=1,就是Pentium Pro 或Pentium II . n* M- R$ Y2 V: s& v- {
  (4) 专门检测AMD的CPU信息 $ ?) _/ ^# t6 g# f( r
  先让EAX=80000001H,再调用CPUID : X, j7 {4 x- k8 f
  如果EAX=51H, 是AMD K5 7 ^% j- H3 G8 z! P
  如 果EAX=66H, 是K6 ' |' ~/ c/ F3 i% T3 @
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 6 H, r8 X8 t6 z! B4 [) V
  EDX 第23 位,CPU是否支持MMX, # x& v' N' `. W, L( Y) h5 y) v

8 g: _! j+ F. {6 i# P  程序如下:2 r+ d- U  @* N2 P+ _. ~

3 f% _) \7 a& e/ I; h% f$ C//------CPUID Instruction Demo Program------------5 f( M( A/ X' J' [, A
#include 8 u6 Q% L: u" c, z3 Y! R4 M2 y
#include
' v9 q+ t# O( f4 B5 t* \#pragma hdrstop
$ W6 _# }/ B7 B" d//------------------------------------------------, b: ~& K) M, L
#pragma inline
6 D3 Y* c+ `$ ]% c' Z#pragma argsused
# u# {; a* R3 d& O9 U5 c$ Uint main(int argc, char **argv)! ?& Q  y" ]( x* T, \6 l# S
{
* [& |5 t2 G/ ^char OEMString[13];
& y, Y' m1 m  h3 E' iint iEAXValue,iEBXValue,iECXValue,iEDXValue;
7 r. |5 c0 Z) ?9 f. G_asm {
! l8 s5 Y% j0 Q9 a+ pmov eax,0) ~1 Y. i2 b8 a1 |
cpuid
  g6 A  u! B: \3 \& f7 k9 X% s* nmov DWORD PTR OEMString,ebx
5 G* q, [9 i+ l$ P0 Dmov DWORD PTR OEMString+4,edx
/ M; }. N3 s; H' N" N4 Jmov DWORD PTR OEMString+8,ecx
* u) r3 j2 T# q) fmov BYTE PTR OEMString+12,0
% F  h1 y8 X" T% F. a# ~}$ M6 Z6 i7 J2 i2 K* {$ ^5 N
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
0 Q6 j( i" b2 |; g! i4 b_asm {
' p: T% T8 F- V/ `" k$ S' Q: Rmov eax,1
6 Y6 L( c  X& K0 w$ W9 Gcpuid
3 f1 c/ F* ~' Kmov iEAXValue,eax! K/ E  [1 ~) q, d% w8 `
mov iEBXValue,ebx
8 n. Y( J2 }- G& p+ I. v! e0 Smov iECXValue,ecx
; Z# v- [0 X* X" Z+ w. x8 s  ymov iEDXValue,edx
# V6 j: E7 r4 q/ R  }}5 S) T( m7 ^$ M4 M
if(iEDXValue&0x800000)
, L$ K6 @; o: @7 P, W9 Y. e) v' Acout < < "This is MMX CPU"< < endl;2 v+ c  e; U2 |) K% g
else
- g+ v2 Z8 F0 v7 x. U8 Y" K) F/ A, Jcout < < "None MMX Support."< < endl;# `7 v$ r: x5 T# n$ e# G& }. I; M
int iCPUFamily=(0xf00 & iEAXValue) > >8;
5 e# ]4 o$ k7 d& n2 [cout < < "CPU Family is:"< < iCPUFamily< < endl;# P. d; E: H- U6 ^5 A
_asm{0 e3 K/ u+ U. m! @6 S
mov eax,2
- q" C( {7 m. L  a$ N7 Q  e3 TCPUID
& \4 C1 G, J; C" `1 A$ }}
. x8 Y3 ~3 F* z( _9 k& c9 @8 p, xif(_AL==1)
; k5 [  r6 H* N4 [' [4 l8 [  _cout < < &quotentium Pro or Pentium II Found";! h) h- t8 y: m
getch();4 r$ _9 k, N6 m% v% R- I
return 0;
  M6 {. L8 M6 s& X* m8 T}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 02:35 , Processed in 0.017854 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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