直接读取asm cpuid

问题描述 投票:0回答:1

如何直接阅读此说明:

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;
c++ assembly driver kmdf
1个回答
1
投票

您传递给

regs
调用
1
__cpuid数组在返回时将具有四个寄存器的值,
EAX
EBX
ECX
EDX
,顺序为(即在数组元素中,
regs[0]
regs[3]
)。您可以使用 normal 数组运算符访问这些元素,并且不需要像您的
eax
.

这样的任何临时“注册”变量

因此,您的“纯”C++ 代码看起来像这样:

int intbuf[12];
int base = 0;
for (leaf = 0x80000002; leaf < 0x80000005; leaf++)
{        
    int regs[4];
    __cpuid(regs, leaf);    
    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;
}

如果你想将

intbuf
保留为
unsigned int
的数组,那么你应该在循环内的分配中添加一个强制转换,例如:

//...
    intbuf[base +1] = static_cast<unsigned int>(regs[1]); // EBX

1本答案基于__cpuid

函数
MSVC实现的运行;其他编译器的版本可能略有不同,但一般原则可能保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.