⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getcpuid.pas

📁 放弃了先前的采用报表实现
💻 PAS
📖 第 1 页 / 共 3 页
字号:
Function TCpuData.CheckCMOVe: Boolean;
Label
   NoCMOVe;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$8000
    jz NoCMOVe
    mov edx,0
    mov TempCheck,edx
  NoCMOVe:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckCMOVe := (TempCheck = 0);
End;

Function TCpuData.CheckSelfSnoop: Boolean;
Label
   NoSelfSnoop;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$8000000
    jz NoSelfSnoop
    mov edx,0
    mov TempCheck,edx
  NoSelfSnoop:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckSelfSnoop := (TempCheck = 0);
End;

Function TCpuData.CheckDebugTraceStore: Boolean;
Label
   NoDebugTraceStore;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$200000
    jz NoDebugTraceStore
    mov edx,0
    mov TempCheck,edx
  NoDebugTraceStore:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckDebugTraceStore := (TempCheck = 0);
End;

Function TCpuData.CheckFXSAVEFXRSTOR: Boolean;
Label
   NoFXSAVEFXRSTOR;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$1000000
    jz NoFXSAVEFXRSTOR
    mov edx,0
    mov TempCheck,edx
  NoFXSAVEFXRSTOR:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckFXSAVEFXRSTOR := (TempCheck = 0);
End;

Function TCpuData.CheckMMX: Boolean;
Label
   NoMMX;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$800000
    jz NoMMX
    mov edx,0
    mov TempCheck,edx
  NoMMX:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckMMX := (TempCheck = 0);
End;

Function TCpuData.CheckMMXplus: Boolean;
Label
   NoMMXplus;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    test edx,$400000
    jz NoMMXplus
    mov edx,0
    mov TempCheck,edx
  NoMMXplus:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckMMXplus := (TempCheck = 0);
End;

Function TCpuData.CheckSSE: Boolean;
Label
   NoSSE;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$2000000
    jz NoSSE
    mov edx,0
    mov TempCheck,edx
  NoSSE:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckSSE := (TempCheck = 0);
End;

Function TCpuData.CheckSSE2: Boolean;
Label
   NoSSE2;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2               /// cpuid
    test edx,$4000000
    jz NoSSE2
    mov edx,0
    mov TempCheck,edx
  NoSSE2:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckSSE2 := (TempCheck = 0);
End;

Function TCpuData.CheckAMD3DNow: Boolean;
Label
   NoAMD3DNow;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    test edx,$80000000
    jz NoAMD3DNow
    mov edx,0
    mov TempCheck,edx
  NoAMD3DNow:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckAMD3DNow := (TempCheck = 0);
End;

Function TCpuData.CheckAMD3DNowPlus: Boolean;
Label
   NoAMD3DNowPlus;
Var
   TempCheck        : dword;
Begin
   TempCheck := 1;
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    test edx,$40000000
    jz NoAMD3DNowPlus
    mov edx,0
    mov TempCheck,edx
  NoAMD3DNowPlus:
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   CheckAMD3DNowPlus := (TempCheck = 0);
End;

Function TCpuData.GetMaxExtendedFunctions: dword;
Var
   TempExt          : dword;
Begin
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000000
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    shl eax,1
    shr eax,1
    mov TempExt,eax
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   GetMaxExtendedFunctions := TempExt;
End;

Procedure TCpuData.GetExtendedFMS(Var Family, Model, Stepping: byte);
Var
   TempFlags        : dword;
   BinFlags         : Array[0..31] Of byte;
   i, Pos           : integer;
Begin
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    mov TempFlags,eax
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   For i := 0 To 31 Do Begin
      BinFlags[i] := TempFlags Mod 2;
      TempFlags := TempFlags Div 2;
   End;
   Family := 0;
   Model := 0;
   Stepping := 0;
   Pos := 0;
   For i := 0 To 3 Do Begin
      Stepping := Stepping + (BinFlags[Pos] * StrToInt(FloatToStr(Power(2,
         i))));
      inc(Pos);
   End;
   Pos := 4;
   For i := 0 To 3 Do Begin
      Model := Model + (BinFlags[Pos] * StrToInt(FloatToStr(Power(2, i))));
      inc(Pos);
   End;
   Pos := 8;
   For i := 0 To 3 Do Begin
      Family := Family + (BinFlags[Pos] * StrToInt(FloatToStr(Power(2,
         i))));
      inc(Pos);
   End;
End;

Function TCpuData.GetExtendedCpuName: String;
Var
   s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12: Array[0..3] Of char;
   TempCpuName      : String;
   i                : integer;
Begin
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000002
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    mov s1,eax
    mov s2,ebx
    mov s3,ecx
    mov s4,edx
    mov eax,$80000003
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    mov s5,eax
    mov s6,ebx
    mov s7,ecx
    mov s8,edx
    mov eax,$80000004
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    mov s9,eax
    mov s10,ebx
    mov s11,ecx
    mov s12,edx
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   TempCpuName := '';
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s1[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s2[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s3[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s4[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s5[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s6[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s7[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s8[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s9[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s10[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s11[i];
   For i := 0 To 3 Do
      TempCpuName := TempCpuName + s12[i];
   GetExtendedCpuName := TempCpuName;
End;

Function TCpuData.GetExtendedL1DCache: word;
Var
   L1D, TempL1D     : dword;
   BinArray         : Array[0..31] Of byte;
   i, p             : integer;
Begin
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000005
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    mov L1D,ecx
    pop edx
    pop ecx
    pop ebx
    pop eax
   End;
   For i := 0 To 31 Do Begin
      BinArray[i] := L1D Mod 2;
      L1D := L1D Div 2;
   End;
   TempL1D := 0;
   p := 0;
   For i := 24 To 31 Do Begin
      TempL1D := TempL1D + (BinArray[i] * StrToInt(FloatToStr(Power(2,
         p))));
      inc(p);
   End;
   GetExtendedL1DCache := TempL1D;
End;

Function TCpuData.GetExtendedL1ICache: word;
Var
   L1I, TempL1I     : dword;
   BinArray         : Array[0..31] Of byte;
   i, p             : integer;
Begin
   Asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000005
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2               /// cpuid
    mov L1I,edx
    pop edx
    pop ecx
    pop ebx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -