小弟在论坛上粘贴了一段代码,用来得到CPU码,如下声明:
    R                              :array[0..19]   of   Char;
    CpuID                          :Integer;
内容:       FillChar(R,   20,   0);
    asm
        mov   eax,   0
        db   0fh,   0a2h
        mov   dword   ptr   R[0],     ebx
        mov   dword   ptr   R[4],     edx
        mov   dword   ptr   R[8],     ecx
        mov   eax,   1
        db   0fh,   0a2h
        mov   CpuID,   edx    end;但总是出现“Access violation at address...”的错误,怎么解决呢??

解决方案 »

  1.   

    如果用屏蔽的话     try
          语句1
          语句2
          语句3
          语句4
          语句5
          语句6
        finally
        //啥也不做
        end;
    如果“语句3”出现问题,跳到finally中,然后还会跳回“语句4”吗?????
      

  2.   

    网上摘地
    //------------------------------------------------------------------------------
    //   //获取CPU ID 和 CPU Vendor
    //------------------------------------------------------------------------------
      //获取CPU ID 和 CPU Vendor
    type 
      TCPUID  = array[1..4] of Longint;
      TVendor = array [0..11] of char;
    function GetCpuIDx : 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 GetCPUVendorx : 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;
    //-------------------------
      (*得到CPUID*)
    Function TFun.GetCPUID:string;
    var
      CPUID : TCPUID;
      I     : Integer;
    begin
      for I := Low(CPUID) to High(CPUID)  do CPUID[I] := -1;
      CPUID := GetCPUIDx;
      result:= IntToStr(CPUID[1])+IntToStr(CPUID[2])+IntToStr(CPUID[3])+IntToStr(CPUID[4]);
    end;
    //------------------------
    (*的到CPUde  Vendor,也就是判断CPU是AMD的还是INTER的*)
    Function TFun.GetCPUVendor: string;
    begin
      result := GetCPUVendorx;
    end;
      

  3.   

    try
      语句1
      语句N
    finally
       语句PPPPPPPP
    end;
    XXXXXXXXXXXXXX
    如果语句1 出错就会执行到 语句PPPPPPPP,然后就向下执行XXXXXXXXXX
      

  4.   

    procedure   TForm1.GetCpuInfo; 
    var 
        R:   array[0..19]   of   Char; 
        CpuID:   Integer; 
    begin 
        FillChar(R,   20,   0); 
        asm 
            mov   eax,   0 
            db   0fh,   0a2h 
            mov   dword   ptr   R[0],     ebx 
            mov   dword   ptr   R[4],     edx 
            mov   dword   ptr   R[8],     ecx 
            mov   eax,   1 
            db   0fh,   0a2h 
            mov   CpuID,   edx 
        end;     ShowMessage( 'CPU制造商为: '   +   R   +   #13#10#13#10   +   '序列号为: '   +   IntToStr(CpuID)); 
    end;