如题...

解决方案 »

  1.   


    用cpuid,这也是唯一。procedure TForm1.Button1Click(Sender: TObject); 
    var rebx,recx,redx:dword;str1:string;beginasmmov eax,0db 0fh,0a2h // cpuidmov rebx,ebxmov recx,ecxmov redx,edxend;str1:=chr(rebx mod $100)+chr((rebx div $100) mod $100)+chr((rebx div$10000) mod $100)+chr((rebx div $1000000) mod $100);str1:=str1+chr(redx mod $100)+chr((redx div $100) mod $100)+chr((redx div$10000) mod $100)+chr((redx div $1000000) mod $100);str1:=str1+chr(recx mod $100)+chr((recx div $100) mod $100)+chr((recx div$10000) mod $100)+chr((recx div $1000000) mod $100);edit1.text:=str1; {一执行此句就出错}end;end.eax, ebx都是比较重要的寄存器,建议你用它们之前先将其入栈(最好将所有寄存器入栈比较保险:pushad/popad),在用完后弹出栈。*************有这样一段代码得出CPU厂家:int mycpuid[20];tchar zzz[20];_asm{mov eax,0cpuidmov mycpuid[0],ebxmov mycpuid[4],edxmov mycpuid[8],ecx}sprintf(zzz,"CPU厂家为:",mycpuid);在VC中编译通过。然而我在DELPHI中却总是无法通过!并且不认cpuid(注:CPUID为微处理器中的一条指令):温柔一刀 时间:00-12-27 16:34:36 ID:426417CPUID这一句换成:DW $A20F  --------------------------------------------------------------------------------来自:chentf 时间:00-12-28 10:06:14 ID:426985vara:array of integer;beginasmmov eax,0DW $A20Fmov a[0],ebxmov a[4],edxmov a[8],ecxend;按F9执行,出现错误提示框:project project1.exe raised exception class ezccessviolation with message 'accessviolation at address 00404B58 in module 'project1.exe',write of address 7563653f'.然后由于水平有限,也看不懂CPU中的消息.  --------------------------------------------------------------------------------来自:Iknow 时间:00-12-28 11:12:33 ID:427051试试以下代码:vara:array[0..15] of byte;dword save_edi, save_esi, save_esp, save_ebp, save_ebx;beginasmmov save_edi, EDImov save_esi, ESImov save_esp, ESPmov save_ebp, EBPmov save_ebx, EBXmov eax,0DW $A20Flea esi, amov edi, 0 // mov a[0],ebxmov dword ptr [esi+edi], ebxadd edi, 4// mov a[4],edxmov dword ptr [esi+edi], edxadd edi, 4// mov a[8],ecxmov dword ptr [esi+edi], ecx mov ebx, save_ebxmov ebp, save_ebpmov esp, save_espmov esi, save_esimov EDI, save_ediend;end; 
      

  2.   

    硬盘序列号:function DiskSerialNo(Drive: Char): integer;
    var
      f: integer;
      Info: BY_HANDLE_FILE_INFORMATION;
      SR: TSearchRec;
    begin
      Result := 0;
      if FindFirst(Drive + ':\*.*', $27, SR) = 0 then
      begin
        f := FileOpen(Drive + ':\' + SR.Name, fmOpenRead or fmShareDenyNone);
        if GetFileInformationByHandle(f, Info) then
          Result := Info.dwVolumeSerialNumber;
        FileClose(f);
        FindClose(SR);
      end;
    end;