【问题标题】:CPUID in x88 Artchitecturex88 架构中的 CPUID
【发布时间】:2012-10-24 02:34:12
【问题描述】:

我正在尝试使用 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 文章解释了这个计划。 我的问题不是很好,但我将不胜感激这方面的任何帮助或指导。

【问题讨论】:

  • 我的意思是 iAPx8088。如果我在学习时说错了,我很抱歉。
  • 8088 没有 CPUID。作为第一代,它真的不需要一个......
  • 8088/8086 没有 cpuid,直到很久以后才有。我已经很久没有查看 cpuid 代码了,但是他们使用自我修改代码来确定预取缓冲区深度,这就是您如何区分非常早期的 x86 处理器(8088 是 x86 系列的一部分,它是一个 8086 8 位外部总线)。

标签: c++ assembly cpuid


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

【讨论】:

  • 我从中得到了很多东西。我仍然不清楚我们发送给函数的参数,当我们在函数调用时更改它们时会发生什么,如 b[0] 和 b[1],etx
  • “函数”是指__cpuid?它根据输入参数a 用一些数据填充数组b。我在答案中显示的是 a == 1 的情况。 b[0] 保存我写的内容, b[1] 保存其他数据等等。您必须根据 a 的值来解释代码(当然,它不是 b 的索引!)。每次迭代只是一组不同的信息/数据。您只输出“第一个”int
猜你喜欢
  • 2018-06-18
  • 2012-08-26
  • 2010-12-12
  • 2011-03-14
  • 2012-03-21
  • 2011-02-24
  • 1970-01-01
  • 2013-01-09
  • 2012-01-23
相关资源
最近更新 更多