|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
3 G& P6 S; s* y" r& K( M* n3 C" f" e) X% P
Intel 486 以上的CPU,3 R3 L( Q. S( \7 _
Cyrix M1 以上的CPU,
9 S( U, E/ q& g# Z* |1 JAMD Am486 以上的CPU
0 i7 e6 z9 P: f8 I5 v8 ~! [/ f7 m: O1 t# {+ w) x% u
(1) 取CPU OEM 字符串, 判断CPU 厂商
8 M/ y$ k7 e7 k" _& G! ~7 G 先让EAX=0, 再调用CPUID
0 r4 W( p0 L) C8 e Inel的CPU将返回:
5 w* h; s% n5 J, f' N$ a4 w. J( Z2 H! d* S; w& G d- L. q7 s
EBX:756E6547H 'Genu'
( d1 R/ d, b7 } q9 S9 P7 O& _EDX:49656E69H 'ineI'
& U8 X' J2 E7 h5 P8 JECX:6C65746EH 'ntel'3 ?$ _2 B, b8 N' m: |% D4 Z, S/ u) s
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
8 b7 Y1 W& f% ]; r, z- {7 |1 u+ I. x1 J4 w9 U$ k; B0 T+ t, ]7 r
Cyrix 的CPU 将返回:
% o _( a2 U2 S7 Y |5 H8 T {) y3 Y" {3 M7 g6 p
EBX:43797269H# l: m) J8 i }
EDX:78496E73H- U/ O* ?/ B- o' n' C5 n' Y
ECX:74656164H& u( T- z$ t6 Q) T$ U* S
"CyrixInstead","Cyrix 来代替"。9 H0 u1 r: g& y# B
9 {* j5 x }- C' q; K6 a+ E
AMD 的CPU 将返回:2 s$ m1 Z. D3 y. p* M9 `
3 A: a) V& S9 T8 V2 ` M/ ^9 d3 q
EBX:41757468H
3 @3 P$ Y2 V# \6 O/ L, MEDX:656E7469H
, m6 H; k5 u' w, ]ECX:63414D44H4 O; j. t5 i& t* u" b
"AuthenticAMD", 可信的AMD。* X! Z( C' ]$ x8 J+ d
- k: f& ?9 b3 x4 B" U: j
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。9 S2 U0 U. M$ a
1 W/ X, u8 K4 W' _
(2)CPU 到底是几86, 是否支持MMX 5 G) v4 J5 K2 n% ^
先让EAX=1,再调用CPUID
9 f1 h4 g( L1 L EAX的8到11位就表明是几86 1 I5 }/ `7 \+ y
9 a, R) P% b, C1 @ @ W1 [
3 - 386
6 J8 a3 F. Y; d7 x7 ~4 - i486# P9 }* R. v7 }5 s/ c' o9 e/ }
5 - Pentium
% e4 D( |6 y( E) S6 - Pentium Pro Pentium II- H! `& D; D0 s/ X. N
2 - Dual Processors/ f/ T4 ]' _) D$ R3 j0 j
$ O4 I- O/ ~& M$ d EDX 的第0位:有无FPU% B# }7 A# O! @( r
Q% e8 b i0 ]/ U2 [) d EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
7 h4 E: L4 J H; k% A! i+ z5 G) I2 w3 S/ @
(3) 专门检测是否P6架构7 M5 F6 \$ ^ X* l/ D6 r
先让EAX=1,再调用CPUID ' N! V! `7 c/ U" }8 T. ^* C' S: I
如果AL=1,就是Pentium Pro 或Pentium II
/ e$ n( ?% j0 l( G (4) 专门检测AMD的CPU信息
: B" o& d/ Q/ S! M& Y. P 先让EAX=80000001H,再调用CPUID
9 [$ m, e. c$ g5 N. I8 t 如果EAX=51H, 是AMD K5
z0 N( n! |2 ` 如 果EAX=66H, 是K6
% W F9 t0 |/ J A# f EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
* X4 Q# \$ x* c1 F& s EDX 第23 位,CPU是否支持MMX,
3 V# g L8 C" Z
8 g( d) [- l2 { n 程序如下:
( L. q9 S# [" `1 B( `+ t. ]6 E1 m N- E5 c7 V) s( P6 e E
//------CPUID Instruction Demo Program------------( `! y) \9 b0 q% M* G$ u
#include
; U2 q5 t; S9 v; K V: r+ ^5 k4 B% s) O#include
8 P& m: m; `2 ]. f" W, y; W3 b#pragma hdrstop
5 {9 ?9 _2 M# G( o/ q8 B//------------------------------------------------1 n% a6 q& u( Y3 k$ R9 y
#pragma inline
( G) r+ r' e7 v. Q2 c5 G$ \#pragma argsused
3 X! M$ u x% ^- Eint main(int argc, char **argv)
, @) a# q6 d) B{4 Z; k' {: i0 M/ `
char OEMString[13];2 B4 L1 T4 j' w$ i5 M( `$ N: ^% |
int iEAXValue,iEBXValue,iECXValue,iEDXValue;( M' J& @1 Z9 L: [ h, W( l" u" M
_asm {
9 `0 }: i* A \' a: jmov eax,0
( E: K: K) x0 M1 {2 c J- ]9 Jcpuid" r! ^1 A7 i. l
mov DWORD PTR OEMString,ebx! X3 s8 i& ?1 x# j
mov DWORD PTR OEMString+4,edx
: |" `( R, N1 N& imov DWORD PTR OEMString+8,ecx
, S; F* j, P, V; Nmov BYTE PTR OEMString+12,0
7 y; X8 `2 l4 T}
. K- i v0 p7 w3 x( g" ^. M1 wcout< < "This CPU 's OEM String is:"< < OEMString< < endl;% @0 t+ X6 D, ?3 a( E
_asm {- [* m% X+ u$ {" k8 E' C
mov eax,1
+ `2 V" M5 t: J8 r2 ?* Mcpuid! P- x6 G1 R4 h% N: S9 ` |
mov iEAXValue,eax
! A7 x" V2 Q/ Umov iEBXValue,ebx
; |( r3 e, `; g( Zmov iECXValue,ecx
3 c* ~$ i8 r, j d1 k- Ymov iEDXValue,edx8 \1 ^- u9 E% C% L; n! L/ E) k
}
0 F. r" I5 V' e1 `if(iEDXValue&0x800000)+ F2 b1 T, P H% ]
cout < < "This is MMX CPU"< < endl;
+ V4 L! c4 W% Telse, f3 k5 M$ X+ e1 |! s/ |
cout < < "None MMX Support."< < endl;6 W% G- h; h5 r4 r! c
int iCPUFamily=(0xf00 & iEAXValue) > >8;
+ Q) t5 Q1 p5 p# i( ]2 bcout < < "CPU Family is:"< < iCPUFamily< < endl;& n' c1 V+ m1 Z/ c& `0 |5 m
_asm{
7 d) C6 M1 R. I& ~" z( d$ J; x, M4 Nmov eax,2& p! M2 O2 L9 S8 M! B% g: |
CPUID) B2 C0 C. k7 V
}; q9 x t3 ]7 }; l6 X. z
if(_AL==1)
5 \$ \* J1 T: U: ocout < < " entium Pro or Pentium II Found";
. j) u7 {) R) e& W5 w& Z. xgetch();3 h# M& E9 R) X# u0 q* }
return 0;
1 ?4 x/ o0 Z0 h' H- L3 [+ t$ d6 v} |
|