1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| const ID_BIT = $200000; type TCPUID = array[1..4] of Longint; TVendor = array [0..11] of char;
function IsCPUID_Available : Boolean; register; asm PUSHFD POP EAX MOV EDX,EAX XOR EAX,ID_BIT PUSH EAX POPFD PUSHFD POP EAX XOR EAX,EDX JZ @exit MOV AL,True @exit: end;
function GetCPUID : TCPUID; assembler; register; asm PUSH EBX PUSH EDI MOV EDI,EAX MOV EAX,1 DW $A20F STOSD MOV EAX,EBX STOSD MOV EAX,ECX STOSD MOV EAX,EDX STOSD POP EDI POP EBX end;
function GetCPUVendor : TVendor; assembler; register; asm PUSH EBX PUSH EDI MOV EDI,EAX MOV EAX,0 DW $A20F MOV EAX,EBX XCHG EBX,ECX 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 POP EBX end;
procedure TForm1.Button1Click(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; Memo1.Lines.Add('CPUID[1] = ' + IntToHex(CPUID[1],8)); Memo1.Lines.Add('CPUID[2] = ' + IntToHex(CPUID[2],8)); Memo1.Lines.Add('CPUID[3] = ' + IntToHex(CPUID[3],8)); Memo1.Lines.Add( 'CPUID[4] = ' + IntToHex(CPUID[4],8)); Memo1.Lines.Add('PValue = '+ IntToStr(CPUID[1] shr 12 and 3)); Memo1.Lines.Add( 'FValue = '+IntToStr(CPUID[1] shr 8 and $f)); Memo1.Lines.Add( 'MValue = '+IntToStr(CPUID[1] shr 4 and $f)); Memo1.Lines.Add( 'SValue = '+IntToStr(CPUID[1] and $f)); S := GetCPUVendor; Memo1.Lines.Add( 'Vendor: ' + S); end else begin Memo1.Lines.Add( 'CPUID not available'); end; end; |