如何直接阅读本说明:
unsigned int eax, ebx, ecx, edx;
unsigned int leaf, subleaf;
unsigned int intbuf[12];`
char *buffer;
int i,j,k,base,start,stop,length;
float freq_GHz;
float frequency;
subleaf=0;
base = 0;
for (leaf=0x80000002; leaf<0x80000005; leaf++) {
__asm__ __volatile__ ("cpuid" : \
"=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (leaf), "c" (subleaf));
intbuf[base] = eax;
intbuf[base+1] = ebx;
intbuf[base+2] = ecx;
intbuf[base+3] = edx;
base += 4;
}
我一直试着这样读它,但它不工作:
for (leaf = 0x80000002; leaf < 0x80000005; leaf++) {
int regs[4];
__cpuid(regs, leaf);
intbuf[base] = (*regs),eax;
intbuf[base + 1] = (*regs),ebx;
intbuf[base + 2] = (*regs),ecx;
intbuf[base + 3] = (*regs),edx;
base += 4;
1条答案
按热度按时间z18hc3ub1#
传递给
__cpuid
call 1的regs
数组在返回时将依次具有四个寄存器EAX
、EBX
、ECX
和EDX
的值(例如,在数组元素regs[0]
到regs[3]
中)。您可以使用 normal 数组操作符访问这些元素,并且不需要任何像eax
这样的临时“register”变量。因此,您的“纯”C++代码看起来像这样:
如果你想把
intbuf
保存为unsigned int
的数组,那么你应该在循环中给赋值语句添加一个强制类型转换,比如:1此答案基于MSVC implementation of the
__cpuid
function的操作;其他编译器的版本可能略有不同,但一般原则可能保持不变。