不知道行不行,你试试看:主要可利用利用CPUID汇编指令(机器码:0FH A2H,如果你的编译器不支持CPUID指 
令,只有emit机器码了)  
该指令可以被如下CPU识别  
Intel 486以上的CPU,  
Cyrix M1以上的CPU,  
AMD Am486以上的CPU  
(1)取CPU OEM字符串,判断CPU厂商  
先让EAX=0,再调用CPUID  
Inel的CPU将返回:  
EBX:756E6547H 'Genu'  
EDX:49656E69H 'ineI'  
ECX:6C65746EH 'ntel'  
EBX,EDX,ECX将连成“GenuineIntel”,真正的Intel。  
Cyrix的CPU将返回:  
EBX:43797269H  
EDX:78496E73H  
ECX:74656164H  
“CyrixInstead”,“Cyrix来代替”。  
AMD的CPU将返回:  
EBX:41757468H  
EDX:656E7469H  
ECX:63414D44H  
“AuthenticAMD",可信的AMD。  
在Windows98中,用右键单击“我的电脑”,选择“属性-常规”在计算机描述处 
就可看见CPU OEM字符串。  (2)CPU到底是几86,是否支持MMX  
先让EAX=1,再调用CPUID  
EAX的 8到11位就表明是几86  
3 - 386  
4 - i486  
5 - Pentium  
6 - Pentium Pro Pentium II  
2 - Dual Processors  
EDX的第0位:有无FPU  
EDX的第23位:CPU 是否支持IA MMX,很重要啊!如果你想用那57条新增的指令,先 
检查这一位吧,否则就等着看Windows的“该程序执行了非法指令,将被关闭”吧 
。  (3)专门检测是否P6架构  
先让EAX=1,再调用CPUID  
如果AL=1,就是Pentium Pro或Pentium II  (4)专门检测AMD的CPU信息  
先让EAX=80000001H,再调用CPUID  
如果EAX=51H,是AMD K5  
如果EAX=66H,是K6  
K7是什么标志,只有等大家拿到K7的芯再说了。  
EDX第0位:是否有FPU(多余的!谁用过没FPU的K5,K6?)  
EDX第23位,CPU 是否支持MMX,  
程序如下:是一个控制台程序,可以给出你的“心”的信息。如果把这个技术用于 
DLL中,便可以使VB程序也知道“心”的信息。  
//------CPUID Instruction Demo Program------------  
#include <conio.h>  
#include <iostream.h>  
#pragma hdrstop  
//------------------------------------------------  
#pragma inline  
#pragma argsused  
int main(int argc, char **argv)  
{  
char OEMString[13];  int iEAXValue,iEBXValue,iECXValue,iEDXValue;  
_asm {  
    mov eax,0  
    cpuid  
    mov DWORD PTR OEMString,ebx  
    mov DWORD PTR OEMString+4,edx  
    mov DWORD PTR OEMString+8,ecx  
    mov BYTE PTR OEMString+12,0  
    }  cout<<"This CPU 's OEM String is:"<<OEMString<<endl; _asm { 
mov eax,1 
cpuid 
mov iEAXValue,eax 
mov iEBXValue,ebx 
mov iECXValue,ecx 
mov iEDXValue,edx 
} if(iEDXValue&0x800000) 
cout <<"This is MMX CPU"<<endl; 
else 
cout <<"None MMX Support."<<endl; int iCPUFamily=(0xf00 & iEAXValue)>>8;  
cout <<"CPU Family is:"<<iCPUFamily<<endl; _asm{ 
mov eax,2 
CPUID 

if(_AL==1) 
cout <<"Pentium Pro or Pentium II Found"; getch(); 
return 0; 

解决方案 »

  1.   

    在注册表中
    "HKEY_LOCAL_MACHINE\hardware\DESCRIPTION\System\CentralProcessor\0"
    对应VendorIndentifier的值 
      

  2.   

    获得Intel CPU的信息
    下面这个函数会返回一个字符串列表及特性集合,这个函数只对Intel 486及以上的CPU有效。其他CPU将返回[cpuNonIntel] 或 [cpuNoCPUID].用法:GetCpuFeatures(memo1.Lines);支持的特性
    ---------------------------------------
    CPU Family 6
    CPU Model 7
    CPU Stepping 3
    On-Chip FPU
    VirtualMode Extensions
    Debugging Extensions
    Page Size Extensions
    Time Stamp Counter
    Model Specific Registers
    Physical Address Extensions
    Machine Check Extensions
    CMPXCHG8B Instruction
    Fast System Call
    Memory Type Range Registers
    Page Global Enable
    Machine Check Architecture
    Conditional Move Instruction
    Page Attribute Table
    32 Bit Page Size Extension
    Intel MMX Technology
    Fast Floating Point Save and Restore
    Streaming SIMD Extensionsunit Unit2;
    interface
    uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;type
      TForm2 = class(TForm)
      private
      { Private declarations }
      public
      { Public declarations }   end;  TCpuFeature = (cpuNoCPUID,cpuNonIntel,cpuOnChipFPU,
      cpuVirtualModeExtensions,cpuDebuggingExtensions,
      cpuPageSizeExtensions,cpuTimeStampCounter,
      cpuModelSpecificRegisters,cpuPhysicalAddressExtensions,
      cpuMachineCheckExtensions,cpuCMPXCHG8B,cpuOnChipAPIC,
      cpuFastSystemCall,cpuMemoryRangeRegisters,cpuPageGlobalEnable,
      cpuMachineCheckArchitecture,cpuConditionalMoveInstruction,
      cpuPageAttributeTable,cpu32bitPageSzExtension,
      cpuProcessorSerialNum,cpuMMXTechnology,cpuFastFloatingPoint,
      cpuSIMDExtensions);  TCpuFeatures = set of TCpuFeature;  function GetCpuFeatures(FeatureList : TStrings = nil) : TCpuFeatures;var Form2: TForm2;
    implementation
    {$R *.DFM}function GetCpuFeatures(FeatureList : TStrings = nil) : TCpuFeatures;
    const
      FPU_FLAG = $0001;
      VME_FLAG = $0002;
      DE_FLAG = $0004;
      PSE_FLAG = $0008;
      TSC_FLAG = $0010;
      MSR_FLAG = $0020;
      PAE_FLAG = $0040;
      MCE_FLAG = $0080;
      CX8_FLAG = $0100;
      APIC_FLAG = $0200;
      SEP_FLAG = $0800;
      MTRR_FLAG = $1000;
      PGE_FLAG = $2000;
      MCA_FLAG = $4000;
      CMOV_FLAG = $8000;
      PAT_FLAG = $10000;
      PSE36_FLAG = $20000;
      PSNUM_FLAG = $40000;
      MMX_FLAG = $800000;
      FXSR_FLAG = $1000000;
      SIMD_FLAG = $2000000;var IsIntel : boolean;
      VendorID : array [0..12] of char;
      IntelID : array [0..12] of char;
      FeaturesFlag,CpuSignature : DWord;
      Temp : DWord;
      RetVar : TCpuFeatures;
      CpuType : byte;  procedure CheckFeature(FeatureFlag : DWord;
      const Item : string;
      cpuFeatureType : TCpuFeature);
      begin
      if FeaturesFlag and FeatureFlag = FeatureFlag then begin
      if FeatureList <> nil then FeatureList.Add(Item);
      include(RetVar,cpuFeatureType);
      end;
      end;begin
      RetVar := [];
      if FeatureList <> nil then FeatureList.Clear;
      IsIntel := false;
      IntelId := 'GenuineIntel'#0;
      VendorID := '------------'#0;  try
      asm  //确认是否支持Intel CPUID调用
      push ebx
      push esi
      push edi
      mov eax,0 // Set up for CPUID instruction
      db 00fh // CPUID - Get Vendor and check INTEL
      db 0a2h
      mov dword ptr VendorId,ebx
      mov dword ptr VendorId[+4],edx
      mov dword ptr VendorId[+8],ecx
      cmp dword ptr IntelId,ebx //检查是否是Intel CPU
      jne @@EndCPUID
      cmp dword ptr IntelId[+4],edx
      jne @@EndCPUID
      cmp dword ptr IntelId[+8],ecx
      jne @@EndCPUID // 非Intel CPU  mov byte ptr IsIntel,1 // Set IsIntel to true
      cmp eax,1 // Ensure 1 is valid input for CPUID
      jl @@EndCPUID // Else jump to end  mov eax,1
      db 00fh // CPUID - Get features,family etc.
      db 0a2h
      mov CpuSignature,eax
      mov FeaturesFlag,edx
      shr eax,8 // Isolate family
      and eax,0fh
      mov byte ptr CpuType,al // Set cputype with family  @@EndCPUID :  pop edi // 恢复寄存器
      pop esi
      pop ebx
      end;  // 检查特性掩码
      if IsIntel then begin
      if FeatureList <> nil then begin
      FeatureList.Add('CPU Family ' + IntToStr(CpuType));
      Temp := (CpuSignature shr 4) and $0f;
      FeatureList.Add('CPU Model ' + IntToStr(Temp));
      Temp := CpuSignature and $0f;
      FeatureList.Add('CPU Stepping ' + IntToStr(Temp));
      end;  CheckFeature(FPU_FLAG,'On-Chip FPU',cpuOnChipFPU);
      CheckFeature(VME_FLAG,
      'VirtualMode Extensions',cpuVirtualModeExtensions);
      CheckFeature(DE_FLAG,'Debugging Extensions',cpuDebuggingExtensions);
      CheckFeature(PSE_FLAG,'Page Size Extensions',cpuPageSizeExtensions);
      CheckFeature(TSC_FLAG,'Time Stamp Counter',cpuTimeStampCounter);
      CheckFeature(MSR_FLAG,
      'Model Specific Registers',cpuModelSpecificRegisters);
      CheckFeature(PAE_FLAG,
      'Physical Address Extensions',
      cpuPhysicalAddressExtensions);
      CheckFeature(MCE_FLAG,
      'Machine Check Extensions',cpuMachineCheckExtensions);
      CheckFeature(CX8_FLAG,'CMPXCHG8B Instruction',cpuCMPXCHG8B);
      CheckFeature(APIC_FLAG,'On Chip APIC',cpuOnChipAPIC);
      CheckFeature(SEP_FLAG,'Fast System Call',cpuFastSystemCall);
      CheckFeature(MTRR_FLAG,
      'Memory Type Range Registers',cpuMemoryRangeRegisters);
      CheckFeature(PGE_FLAG,'Page Global Enable',cpuPageGlobalEnable);
      CheckFeature(MCA_FLAG,
      'Machine Check Architecture',cpuMachineCheckArchitecture);
      CheckFeature(CMOV_FLAG,
      'Conditional Move Instruction',
      cpuConditionalMoveInstruction);
      CheckFeature(PAT_FLAG,'Page Attribute Table',cpuPageAttributeTable);
      CheckFeature(PSE36_FLAG,
      '32 Bit Page Size Extension',cpu32BitPageSzExtension);
      CheckFeature(PSNUM_FLAG,
      'Processor Serial Number',cpuProcessorSerialNum);
      CheckFeature(MMX_FLAG,'Intel MMX Technology',cpuMMXTechnology);
      CheckFeature(FXSR_FLAG,
      'Fast Floating Point Save and Restore',
      cpuFastFloatingPoint);
      CheckFeature(SIMD_FLAG,'Streaming SIMD Extensions',cpuSIMDExtensions);
      end
      else begin
      if FeatureList <> nil then
      FeatureList.Add('Non-Intel or >486 Chip - Features Unknown');
      include(RetVar,cpuNonIntel);
      end;
      except
      if FeatureList <> nil then FeatureList.Add('No CPUID Support');
      include(RetVar,cpuNoCPUID);
      end;  Result := RetVar;
    end;end.
      

  3.   

    unit Unit1; 
     
    interface 
     
    uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
      StdCtrls; 
     
    type 
      TCPUID  = array[1..4] of Longint; 
      TForm1 = class(TForm) 
        Button1: TButton; 
        Memo1: TMemo; 
        procedure Button1Click(Sender: TObject); 
        function GetCPUID : TCPUID; 
      private 
        { Private declarations } 
      public 
        { Public declarations } 
      end; 
     
    var 
    tp:Tcpuid; 
    Form1: TForm1; 
     
    implementation 
    {$R *.DFM} 
    function TForm1.GetCPUID : TCPUID; assembler; register; 
    asm 
      PUSH    EAX 
      PUSH    EBX 
      PUSH    ECX 
      PUSH    EDI 
      MOV    EDI,EDX 
      MOV    EAX,1 
      DW      $A20F 
      STOSD 
      MOV    EAX,EBX 
      STOSD 
      MOV    EAX,ECX 
      STOSD 
      MOV    EAX,EDX 
      STOSD 
      POP    EDI 
      POP    ECX 
      POP    EBX 
      POP    EAX 
    end; 
     
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    tp:=getcpuid; 
    memo1.Lines.Add(floattostr(tp[1])); 
    memo1.Lines.Add(floattostr(tp[2])); 
    memo1.Lines.Add(floattostr(tp[3])); 
    memo1.Lines.Add(floattostr(tp[4])); 
    end;
      

  4.   

    var
       a:array[0..15] of byte;
       dword save_edi, save_esi, save_esp, save_ebp, save_ebx;
    begin
       asm     mov save_edi, EDI
         mov save_esi, ESI
         mov save_esp, ESP
         mov save_ebp, EBP
         mov save_ebx, EBX     mov eax,0     DW $A20F     lea esi, a
         mov edi, 0
         
        // mov a[0],ebx
        mov dword ptr [esi+edi], ebx
        add edi, 4
        // mov a[4],edx
        mov dword ptr [esi+edi], edx
        add edi, 4
        // mov a[8],ecx
        mov dword ptr [esi+edi], ecx
         mov ebx, save_ebx
         mov ebp, save_ebp
         mov esp, save_esp
         mov esi, save_esi
         mov EDI, save_edi
       end;
    end;
    可以的。