如何直接读取CPUID指令?使用__cpuid函数实现遇问题求助
正确使用__cpuid函数读取CPUID Leaf信息的方法
你原来的内嵌汇编代码可以正常获取0x80000002到0x80000004这几个Leaf的CPUID信息,但改用__cpuid函数时的写法存在语法和逻辑错误,以下是修正后的实现和问题说明:
错误原因分析
你写的赋值语句intbuf[base] = (*regs),eax;存在两个核心问题:
- 语法错误:逗号在这里是逗号运算符,
(*regs)仅取数组第一个元素,后面的eax是未定义变量(你没有单独声明这个变量),会直接导致编译失败。 - 逻辑错误:不理解
__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
相关产品推荐
相关产品推荐

