I am trying to access the Information using CPUID in C++. I have produced this code so far and could not go any longer. I found some useful articles here and on the web but they did not seem to help me.
I am supposed to use instructions and registers from x88 only. This is the code.
int b[5] = {0} ;
for (int a = 0; a < 5 ; a++)
{
__cpuid (b,a) ;
std::cout << "The code " << a << " gives " << b[0] << std::endl;
}
I am unable to go any further as I cannot understand how to fetch the information from this array bitwise. I have this wiki and msdn article which explains the scheme. My question is not very good but I would appreciate any help or direction in this regard.
I suppose your problem is not about accessing the array data through an index, which is as you already done b[0]
, b[1]
and so on. You need a little bit of bit (!) manipulation. You have to mask out the bits you are not interested in and interpret what is left; e.g.
(b[0] & 0xF0) >> 4
will give you 4 bits (4-7) that are the model according to MSDN. And so on. Consider the following
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 supposed 32 bit int — or wider)
If you want e.g. the processor type, you need:
0000 0000 0000 0000 0011 0000 0000 0000
\R_/ \ext_Fam/ \eM/ RRpp \fm/ \md/ \sd/
and then shift (logical shift) right of 3 "nibbles" (12). So
(b[0] >> 12) & 3
will give you a number representing processor type. (The number 3 is 11 in base 2, so it's the right mask to select only the rightmost two bits).