DELPHI版的冤程序,你可以改为C版本的:unit Main;interfaceuses
  Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,StdCtrls,Buttons;type
  TDemoForm = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    GetButton: TBitBtn;
    CloseButton: TBitBtn;
    Bevel1: TBevel;
    Label5: TLabel;
    FLabel: TLabel;
    MLabel: TLabel;
    PLabel: TLabel;
    SLabel: TLabel;
    PValue: TLabel;
    FValue: TLabel;
    MValue: TLabel;
    SValue: TLabel;
    procedure GetButtonClick(Sender: TObject);
  end;var
  DemoForm: TDemoForm;implementation{$R *.DFM}const
  ID_BIT =$200000; // EFLAGS ID bit
type
  TCPUID = array[1..4] of Longint;
  TVendor = array [0..11] of char;function IsCPUID_Available : Boolean; register;
asm
  PUSHFD {direct access to flags no possible, only via stack}
  POP     EAX {flags to EAX}
  MOV     EDX,EAX {save current flags}
  XOR     EAX,ID_BIT {not ID bit}
  PUSH    EAX   {onto stack}
  POPFD   {from stack to flags, with not ID bit}
  PUSHFD   {back to stack}
  POP     EAX   {get back to EAX}
  XOR     EAX,EDX {check if ID bit affected}
  JZ      @exit   {no, CPUID not availavle}
  MOV     AL,True {Result=True}
@exit:
end;function GetCPUID : TCPUID; assembler; register;
asm
  PUSH    EBX         {Save affected register}
  PUSH    EDI
  MOV     EDI,EAX     {@Result}
  MOV     EAX,1
  DW      $A20F       {CPUID Command}
  STOSD               {CPUID[1]}
  MOV     EAX,EBX
  STOSD               {CPUID[2]}
  MOV     EAX,ECX
  STOSD               {CPUID[3]}
  MOV     EAX,EDX
  STOSD               {CPUID[4]}
  POP     EDI       {Restore registers}
  POP     EBX
end;function GetCPUVendor : TVendor; assembler; register;
asm
  PUSH    EBX  {Save affected register}
  PUSH    EDI
  MOV     EDI,EAX  {@Result (TVendor)}
  MOV     EAX,0
  DW      $A20F    {CPUID Command}
  MOV     EAX,EBX
  XCHG    EBX,ECX       {save ECX result}
  MOV     ECX,4
@1:
  STOSB
  SHR     EAX,8
  LOOP    @1
  MOV     EAX,EDX
  MOV   ECX,4
@2:
  STOSB
  SHR     EAX,8
  LOOP    @2
  MOV     EAX,EBX
  MOV   ECX,4
@3:
  STOSB
  SHR     EAX,8
  LOOP    @3
  POP     EDI {Restore registers}
  POP     EBX
end;procedure TDemoForm.GetButtonClick(Sender: TObject);
var
  CPUID : TCPUID;
  I     : Integer;
  S : TVendor;
begin
  for I := Low(CPUID) to High(CPUID)  do CPUID[I] := -1;
  if IsCPUID_Available then begin
    CPUID := GetCPUID;
    Label1.Caption := 'CPUID[1] = ' + IntToHex(CPUID[1],8);
    Label2.Caption := 'CPUID[2] = ' + IntToHex(CPUID[2],8);
    Label3.Caption := 'CPUID[3] = ' + IntToHex(CPUID[3],8);
    Label4.Caption := 'CPUID[4] = ' + IntToHex(CPUID[4],8);
    PValue.Caption := IntToStr(CPUID[1] shr 12 and 3);
    FValue.Caption := IntToStr(CPUID[1] shr 8 and $f);
    MValue.Caption := IntToStr(CPUID[1] shr 4 and $f);
    SValue.Caption := IntToStr(CPUID[1] and $f);
    S := GetCPUVendor;
    Label5.Caption := 'Vendor: ' + S; end
  else begin
    Label5.Caption := 'CPUID not available';
  end;
end;end.