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;

解决方案 »

  1.   

    试试这个,很简单!
    function GetDiskID : longint; assembler;register;
    asm
    PUSH    EBX         
    PUSH    EDI
    MOV     EDI,EAX     //@Resukt}
    MOV     EAX,1
    DW      $A20F       
    MOV     EAX,EDX     
    POP     EDI
    POP     EBX         
    end;不过,此类取CPU序列号只针对老式的CPU,P4以上已经禁用CPU序列号了。
      

  2.   

    这方面的东东很多啊,借花献拂
    以下函数可以,但并不是每个Cpu都行,好像只有部分p3的cpu才有序列号,并且要在cmos中设为可读,p4因为隐私问题取消了。
    type
     TCPUID = array[1..4] of Longint;function GetCPUIDSN : TCPUID; assembler; register;
    asm
      PUSH    EBX         {Save affected register}
      PUSH    EDI         {数据段偏移指针}
      MOV     EDI,EAX     {指向@Result}
      MOV     EAX,1
      DW      $A20F       {CPUID 指令的二进制代码}
      STOSD               {传送PUID[1]到[EDI+1],EDI自动加1}
      MOV     EAX,EBX
      STOSD               {传送CPUID[2]到[EDI+2]}
      MOV     EAX,ECX
      STOSD               {CPUID[3]}
      MOV     EAX,EDX
      STOSD               {CPUID[4]}
      POP     EDI     {Restore registers}
      POP     EBX
    end;
    end
      

  3.   

    方二:
    function GetDiskSerial(DiskChar: Char): string;
    var
    SerialNum : pdword;
    a, b : dword;
    Buffer : array [0..255] of char;
    begin
    result := "";
    if GetVolumeInformation(PChar(diskchar+":\"), Buffer, SizeOf(Buffer), SerialNum,
    a, b, nil, 0) then
     Result := IntToStr(SerialNum^);
    end;
      

  4.   

    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     {@Resukt}
      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.
      

  5.   

    已说过了,上述代码只针对老式CPU有效!