用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;
硬盘序列号: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;
用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;
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;