• DELPHI获取CPU信息


    一、获取CPU厂家信息

    Const
    CPUVendorIDs :array[0..5] of string = ('GenuineIntel','UMC UMC UMC','AuthenticAMD','CyrixInstead','NexGenDriven','CentaurHauls');
    //将CPU厂家信息转换成字串形式
    CPUVendors :array[0..5] of string = ('Intel','UMC','AMD','Cyrix','NexGen','CentaurHauls');

    type TVendor = array [0..11] of char;

    // 获取CPU厂家信息,返回值为TVendor类型
    function GetCPUVendor : TVendor; assembler; register;
    asm
    PUSH EBX
    PUSH EDI
    MOV EDI,EAX
    MOV EAX,0
    DW $A20F //CPUID指令
    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;
    调用方式:
    var
    Vendor: string;
    VendorID, I: integer;
    begin
    Vendor := GetCPUVendor;
    for i := 0 to High(CPUVendorIDs) do
    begin
    If Vendor = CPUVendorIDs[I] then
    begin
    Vendor := CPUVendors[I]; //把厂家信息精简一下,好看多了
    VendorID := i;
    break;
    end;
    end;
    end;


    二、获取CPU类型信息
    const ID_BIT=$200000; //CPU ID 位标记
    type TCPUID=array[1..4] of Longint;

    //判断CPUID信息是否有效
    function IsCPUIDAvailable : Boolean; register;
    asm
    PUSHFD //不允许直接存取,必须通过堆栈
    POP EAX
    MOV EDX,EAX
    XOR EAX,ID_BIT
    PUSH EAX
    POPFD
    PUSHFD
    POP EAX
    XOR EAX,EDX //检测ID位是否受影响
    JZ @exit //CPUID无效
    MOV AL,True //CPUID无效
    @exit:
    end;

    //获取CPUID信息,返回值为TCPUID类型
    function GetCPUID : TCPUID; assembler; register;
    asm
    PUSH EBX
    PUSH EDI
    MOV EDI,EAX
    MOV EAX,1
    DW $A20F //CPUID指令
    STOSD //CPUID[1]
    MOV EAX,EBX
    STOSD //CPUID[2]
    MOV EAX,ECX
    STOSD //CPUID[3]
    MOV EAX,EDX
    STOSD //CPUID[4]
    POP EDI
    POP EBX
    end;
    具体使用方法:
    const
    CPUSubModels: array[0..4] of string = ('Primary','OverDrive','Secondary','Reserved','Not Detected');
    var
    CPUID: TCPUID;
    SubModel: string;
    SubModelID, Family, Model, Stepping: Integer;
    begin
    //如果CPUID信息有效
    if IsCPUIDAvailable then
    begin
    fillchar(CPUID, sizeof(CPUID), -1);
    CPUID := GetCPUID;
    SubModelID := CPUID[1] shr 12 and 3;
    Family := CPUID[1] shr 8 and $F;
    Model := CPUID[1] shr 4 and $F;
    Stepping:= CPUID[1] and $F;
    if SubModelID < 4 then
    SubModel := CPUSubModels[SubModelID]
    else
    SubModel := CPUSubModels[4];
    end;
    end;

    由所获取的信息,可在下表中找出相应的CPU类型

    Family VendorID Model CPU类型
    4 0 0 i80486DX-25/33
    1 i80486DX-50
    2 i80486SX
    3 i80486DX2
    4 i80486SL
    5 i80486SX2
    7 i80486DX2WB
    8 i80486DX4
    9 i80486DX4WB
    4 1 1 U5D(486DX)
    2 U5S(486SX)
    4 2 3 80486DX2WT
    7 80486DX2WB
    8 80486DX4
    9 80486DX4WB
    14 5x86
    15 5x86WB
    4 3 4 Cyrix Media GX
    9 Cyrix 5x86
    5 0 0 P5 A-step
    1 P5
    2 P54C
    3 P24T OverDrive
    4 P55C
    5 DX4 OverDrive?
    6 P5 OverDrive?
    7 P54C
    8 P55C(0.25)MMX
    5 2 0 SSA5
    1 5k86
    2 5k86
    3 5k86
    6 K6
    7 K6
    8 K6-3D
    9 K6PLUS-3D
    5 3 0 Pentium Cx6X86 GXm
    2 Std. Cx6x86
    4 Cx6x86 GXm
    5 4 - Nx586
    5 5 - IDT C6 (WinChip)
    6 0 0 PentiumPro A-step
    1 Pentium Pro
    3 Pentium II
    4 P55CT (P54 overdrive)
    5 Pentium II (0.25)
    6 2 6 K6
    7 K6
    8 K6-3D
    9 K6PLUS-3D
    6 3 0 Cx6x86 MX/MII
    很遗憾,没能找到最新的资料。哪位朋友有的,帮忙给我一份,谢谢。


    三、查看CPU所支持的功能/技术

    if (CPUID[4] and $800000)<>0 then
    //支持MMX指令
    else
    //不支持


    //CPU是否支持3DNow技术
    function Is3DNowSupport: Boolean; assembler;
    asm
    push ebx
    mov @Result, True
    mov eax, $80000000 //查询扩展功能
    dw $A20F
    cmp eax, $80000000 //是否支持8000_0001h扩展功能
    jbe @NOEXTENDED //不支持
    mov eax, $80000001 //起动8000_0001h扩展功能
    dw $A20F
    test edx, $80000000 //测试第31位
    jnz @EXIT //支持
    @NOEXTENDED:
    mov @Result, False
    @EXIT:
    pop ebx
    end;

    四、检测CPU实际运行频率
    //获取CPU实际运行频率,返回值以MHz为单位
    function GetCPUSpeed: Double;
    const
    DelayTime = 500;
    var
    TimerHi, TimerL DWORD;
    PriorityClass, Priority: Integer;
    begin
    PriorityClass := GetPriorityClass(GetCurrentProcess);
    Priority := GetThreadPriority(GetCurrentThread);

    SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

    Sleep(10);
    asm
    dw 310Fh // RDTSC指令
    mov TimerLo, eax
    mov TimerHi, edx
    end;
    Sleep(DelayTime);
    asm
    dw 310Fh // rdtsc
    sub eax, TimerLo
    sbb edx, TimerHi
    mov TimerLo, eax
    mov TimerHi, edx
    end;

    SetThreadPriority(GetCurrentThread, Priority);
    SetPriorityClass(GetCurrentProcess, PriorityClass);

    Result := TimerLo / (1000.0 * DelayTime);
    end;

  • 相关阅读:
    Linux系统性能测试工具(八)——网络性能测试工具之netperf
    netperf编译./configure时报错 "error: cannot guess build type;you nust specify one"
    Linux系统性能测试工具(七)——网络性能工具之iperf
    Linux系统性能测试工具(六)——磁盘io性能工具之dd
    Linux系统性能测试工具(五)——磁盘io性能工具之fio
    python xml解析之 xml.etree.ElementTree
    yield 与 yield from
    python collections
    python __str__ 与 __repr__区别
    pyqt 小工具-文件浏览器(1)
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/2217086.html
Copyright © 2020-2023  润新知