|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
. t' Z* h! A g( u- h: o' m) M1 T
. Y* N! T$ T+ {# mIntel 486 以上的CPU,
' L4 A7 W( E8 j# {/ wCyrix M1 以上的CPU,. c w) V% o) i. [3 d
AMD Am486 以上的CPU
; j4 F8 J; n9 g
7 ?: q. P+ Q" x9 k (1) 取CPU OEM 字符串, 判断CPU 厂商
6 f2 e7 z7 s1 l2 ?& F* C 先让EAX=0, 再调用CPUID ! l$ n! c+ ^6 K! l6 K
Inel的CPU将返回: 8 i! z) p" R* U! F
9 d# Q! q. z' q5 v) ]& zEBX:756E6547H 'Genu'; t: k0 b- o$ {: B& `* y3 u
EDX:49656E69H 'ineI'
4 U6 K) v# Y/ T) ]! HECX:6C65746EH 'ntel'
0 E8 S2 Y: f* l3 ? w, L, R. w) PEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。5 G6 W0 c4 ^) ~! i. N. b# c
+ T9 c0 }/ I& J6 X+ Y
Cyrix 的CPU 将返回:
1 T, H0 X- r- R; b2 v) g
4 |9 h$ l6 j2 F' x3 ~# B# gEBX:43797269H H9 p1 Y2 c) g9 ]: y6 ?. z
EDX:78496E73H
/ ?; K( d2 ~7 H$ f: l1 G- A' ^ECX:74656164H
7 P" @ f/ {( |' S"CyrixInstead","Cyrix 来代替"。! u8 Z/ @5 A7 N6 a! U1 L
% W1 ?# b8 F' L( C0 C
AMD 的CPU 将返回:8 ]$ P( d1 |3 c! {
/ b/ u" s' r$ p" H% h! B
EBX:41757468H
4 D2 E) u9 R5 J4 X9 @2 w4 k4 e3 gEDX:656E7469H- J0 ^9 n4 P. ?; I
ECX:63414D44H
- L. N$ ~+ p1 y"AuthenticAMD", 可信的AMD。" ~+ R$ A6 c* {- k/ R2 b
4 `7 q+ P2 w% Z+ W4 M6 B 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。! c q) w z) o% @% R
4 E6 r+ T8 C9 G% y6 u# S (2)CPU 到底是几86, 是否支持MMX 6 g, ]) s2 e7 V, m
先让EAX=1,再调用CPUID
1 [) ~5 R+ Q! D+ k# ]! ^& u4 F EAX的8到11位就表明是几86
3 @7 T( J0 ?$ A- q
8 n$ J5 t c* D+ g0 P7 z3 - 386
. C8 ?, o$ u& g4 F4 ]4 - i486
8 {3 v- t' `2 f7 J) b5 - Pentium
2 _4 B4 Y( `$ F8 M7 j6 - Pentium Pro Pentium II
( c# m; \1 W( S0 S* s" v9 P( K2 - Dual Processors/ J. S9 }, U8 v+ q! W
0 w% \4 ~3 j' M8 ~6 _ EDX 的第0位:有无FPU, n3 s& c$ h6 K/ m' h* H4 A
+ ?% }) t' X0 T+ c6 a EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 # F; J- E' l% Q# Q6 |' V
4 j3 o# B3 O' y8 ]& k (3) 专门检测是否P6架构7 z7 v# n3 |# F& u9 B v" q6 R0 N
先让EAX=1,再调用CPUID 0 @1 |6 z9 c+ I% d
如果AL=1,就是Pentium Pro 或Pentium II
% z/ m: {& z* B% \& d# E (4) 专门检测AMD的CPU信息 1 B! H7 N) Q; z
先让EAX=80000001H,再调用CPUID
4 J6 Z, _7 s( t3 t+ Q0 l 如果EAX=51H, 是AMD K5
! m6 t1 ?3 N' R2 l) w8 P: A 如 果EAX=66H, 是K6 8 M# B- p& u' @
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
7 ^" r" ~: C. g2 v EDX 第23 位,CPU是否支持MMX, 7 b6 v: ` M( p$ |! O" S
1 T w0 U- _" P- T4 R 程序如下:
) `3 G( E$ f; z8 j8 k) U7 @. M) r( N1 ^( r' u; S* L- t
//------CPUID Instruction Demo Program------------
. {" A, G4 K$ u. |6 M: A6 D#include 5 Q& p% u& T$ C: f8 s) a% Y' |
#include $ F" _3 E6 l7 E2 D% m! P
#pragma hdrstop) K, P R- y( {- _& X
//------------------------------------------------
& ~6 q. I* m1 ^$ x#pragma inline# r, [# b. }: A+ f }
#pragma argsused& O5 s; w, H8 q
int main(int argc, char **argv)
1 _2 G4 F4 D; V, W8 R8 l$ R( d+ V{
\7 r% a% ?, e' _char OEMString[13];. d9 g: s& w1 C
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
4 i; d: ]6 e# D! R$ ^_asm {: Q& h* d1 _9 d0 D/ \
mov eax,0
' y( ^ L; Z) I+ m$ ]6 Ycpuid
0 D9 h/ }7 U6 a6 Y+ D% c2 ?1 A; Kmov DWORD PTR OEMString,ebx
# ^) h) l1 B* ` C) ]; R8 pmov DWORD PTR OEMString+4,edx
# X) i @" s) Y! c% p/ G, k! p9 Wmov DWORD PTR OEMString+8,ecx) w( `- g6 V* T* d
mov BYTE PTR OEMString+12,0
" r, x7 a- j- J0 A0 p/ ?* {2 Q}6 o n" s' f2 L1 v
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;9 B; |" K! A- h
_asm {5 P* f: U3 N$ N5 e v
mov eax,1
4 M4 K: E5 b; h% u: Gcpuid& E, X" ~" z9 U! @1 Y3 Y8 V
mov iEAXValue,eax6 O. b& D# y: ~7 N( |1 u2 s0 N! ~
mov iEBXValue,ebx
3 J! V; k8 q2 _0 A* q4 X* \2 zmov iECXValue,ecx
! n! n! g; e1 M# @# [mov iEDXValue,edx# q* c0 w! a( P$ H) s' ?( q
}5 }) M. r# p& W; O( C4 ?
if(iEDXValue&0x800000)
7 ^$ a% K* w3 d% X" L" A+ W' ycout < < "This is MMX CPU"< < endl;
$ R) c( ]- q, Aelse
' ?5 o4 F0 r1 p8 z Z: `cout < < "None MMX Support."< < endl;5 @. A3 b: ^9 X# A0 t9 |
int iCPUFamily=(0xf00 & iEAXValue) > >8;0 s3 F" O% D- w# L' ^. E
cout < < "CPU Family is:"< < iCPUFamily< < endl;
0 K) b) V- N; d_asm{
/ ^' u: A: t1 @9 Umov eax,2
0 |8 S2 K6 h+ o. f; y/ P0 CCPUID4 n5 N# b. ~; y. |9 @3 k8 z4 g
}, C7 M! v9 d# k3 `6 n# C" Y$ C
if(_AL==1)
3 C% t$ i( | {* Z. Mcout < < " entium Pro or Pentium II Found";5 j' X& T: G1 t& O$ W& A) D, n4 X
getch();$ F' y3 {# R$ p7 B5 ~
return 0;
8 `" B6 G) P6 ]} |
|