assembly x86体系结构中的CPUID

iezvtpos  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(116)

我正在尝试使用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文章解释了这个方案。我的问题不是很好,但我希望在这方面得到任何帮助或指导。

u0njafvf

u0njafvf1#

我想你的问题不是通过索引访问数组数据,就像你已经做过的b[0]b[1]等等一样,你需要一点bit(!)操作,你必须屏蔽掉你不感兴趣的位,并解释剩下的内容;例如:

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

我会给予你4位(4-7),这是根据MSDN的模型。等等。

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位整数或更宽)
例如,如果您需要处理器类型,则需要:

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,因此它是只选择最右边两位的正确掩码)。

相关问题