You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接读取CPUID指令?使用__cpuid函数实现遇问题求助

正确使用__cpuid函数读取CPUID Leaf信息的方法

你原来的内嵌汇编代码可以正常获取0x80000002到0x80000004这几个Leaf的CPUID信息,但改用__cpuid函数时的写法存在语法和逻辑错误,以下是修正后的实现和问题说明:

错误原因分析

你写的赋值语句intbuf[base] = (*regs),eax;存在两个核心问题:

  1. 语法错误:逗号在这里是逗号运算符,(*regs)仅取数组第一个元素,后面的eax是未定义变量(你没有单独声明这个变量),会直接导致编译失败。
  2. 逻辑错误:不理解__cpuid的返回值存储规则——它会把CPUID指令返回的EAX/EBX/ECX/EDX依次存入传入的数组,索引0对应EAX,1对应EBX,2对应ECX,3对应EDX。

修正后的代码

unsigned int intbuf[12];
int base = 0;

// 遍历目标Leaf范围:0x80000002 ~ 0x80000004
for (unsigned int leaf = 0x80000002; leaf <= 0x80000004; leaf++) {
    int regs[4];
    // 调用__cpuid,传入要查询的Leaf值,结果存入regs数组
    __cpuid(regs, leaf);
    
    // 按顺序将寄存器值存入intbuf
    intbuf[base]     = regs[0];  // 对应原汇编的eax
    intbuf[base + 1] = regs[1];  // 对应原汇编的ebx
    intbuf[base + 2] = regs[2];  // 对应原汇编的ecx
    intbuf[base + 3] = regs[3];  // 对应原汇编的edx
    
    base += 4;
}

补充说明(针对Subleaf非0的场景)

如果后续需要传入非0的Subleaf参数(对应CPUID指令的ECX输入),请使用__cpuid_count函数(GCC、MSVC等主流编译器均支持),示例如下:

unsigned int subleaf = 0; // 可替换为需要的Subleaf值
for (unsigned int leaf = 0x80000002; leaf <= 0x80000004; leaf++) {
    int regs[4];
    __cpuid_count(leaf, subleaf, regs[0], regs[1], regs[2], regs[3]);
    
    intbuf[base]     = regs[0];
    intbuf[base + 1] = regs[1];
    intbuf[base + 2] = regs[2];
    intbuf[base + 3] = regs[3];
    
    base += 4;
}

内容的提问来源于stack exchange,提问作者daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:15:38