3

我正在尝试使用 C++ 中的 CPUID 访问信息。到目前为止,我已经制作了这段代码,不能再去了。我在这里和网上找到了一些有用的文章,但它们似乎对我没有帮助。

我应该只使用来自 x88 的指令和寄存器。这是代码。

int b[5] = {0} ;

for (int a = 0; a < 5 ; a++)
{
    __cpuid (b,a) ;
    std::cout << "The code " << a << " gives " << b[0] << std::endl;
}

我无法更进一步,因为我无法理解如何按位从该数组中获取信息。我有这篇wikimsdn文章解释了这个方案。我的问题不是很好,但我将不胜感激这方面的任何帮助或指导。

4

1 回答 1

1

我想您的问题不在于通过索引访问数组数据,就像您已经完成的那样b[0]b[1]依此类推。你需要一点点(!)操作。你必须屏蔽掉你不感兴趣的部分并解释剩下的部分;例如

    (b[0] & 0xF0) >> 4

根据 MSDN,将为您提供 4 位 (4-7) 的模型。等等。考虑以下

    3            2            1
    1098 7654 3210 9876 5432 1098 7654 3210
    0000 0000 0000 0000 0000 0000 0000 0000 
    \R_/ \ext_Fam/ \eM/ RRpp \fm/ \md/ \sd/

    R = reserved
    ext_Fam = extended family
    eM = extended model
    pp = processor type
    fm = family
    md = model
    sd = stepping id

(int 假定为 32 位 int — 或更宽)

如果你想要例如处理器类型,你需要:

    0000 0000 0000 0000 0011 0000 0000 0000 
    \R_/ \ext_Fam/ \eM/ RRpp \fm/ \md/ \sd/

然后向右移动(逻辑移动)3个“半字节”(12)。所以

   (b[0] >> 12) & 3

会给你一个代表处理器类型的数字。(数字 3 是以 2 为底的 11,因此只选择最右边的两位是正确的掩码)。

于 2012-11-03T18:37:37.263 回答