[C/C++][CPUID 07H]通过使用CPUID获取cpu是否支持混合架构(Hybrid,E-core,P-core)

这段时间打算手搓一个类似于CPUz的工具,在尝试获取cpu是否支持混合架构的方法上卡了很久,这里记录一下

我查询了Intel® 64 and IA-32 Architectures Software Developer’s Manual发现需要使用0x07功能,摘录文档如下:

EDX Bit 15: Hybrid. If 1, the processor is identified as a hybrid part. If CPUID.0.MAXLEAF ≥ 1AH and CPUID.1A.EAX ≠ 0, then the Native Model ID Enumeration Leaf 1AH exists。

翻译如下: 当使用07H功能后,EDX寄存器中的第15位标识着CPU是否为混合架构,当第15位置位时,表明CPU为混合架构,我使用下列代码来实现

#include 
#include 
#include 

// 函数:检查 unsigned int 类型变量的某个位是否被置位
// 参数:num - 要检查的数字
//       pos - 要检查的位置(从 0 开始)
// 返回值:如果位被置位则返回 true,否则返回 false
bool isBitSet(unsigned int num, unsigned int pos)
{
    // 检查 pos 是否在有效范围内
    if (pos >= sizeof(unsigned int) * 8)
    {
        // 如果位置超出范围,返回 false
        return false;
    }
    // 使用位掩码检查位是否被置位
    return (num & (1 << pos)) != 0;
}

int main()
{
    unsigned int eax, ebx, ecx, edx;

    // 第一步:获取支持的最大 CPUID 功能号
    // 功能号 0 返回最大支持的 CPUID 功能号
    __cpuid(0, eax, ebx, ecx, edx);
    unsigned int maxFuncNumber = eax;

    // 第二步:检查是否支持 CPUID 功能号 07H
    if (maxFuncNumber >= 0x07)
    {
        // 使用功能号 07H 和子功能号 0 执行 CPUID 指令
        __cpuid_count(0x07, 0, eax, ebx, ecx, edx);

        // 检查 EDX 寄存器的第 15 位(混合架构位)是否被设置
        if (isBitSet(edx, 15))
        {
            printf("该 CPU 为混合架构。\n");
        }
        else
        {
            printf("该 CPU 为混合架构。\n");
        }
    }
    else
    {
        printf("该 CPU 不支持 CPUID 功能号 07H。\n");
    }

    return 0;
}

我在我i9-14900HX的电脑上正常运行

你可能感兴趣的:(我的CPUZ手搓日记,c语言,c++,汇编)