CPUID в x88 Artchitecture

Я пытаюсь получить доступ к информации с помощью CPUID в C ++.
Я создал этот код до сих пор и больше не мог идти.
Я нашел несколько полезных статей здесь и в Интернете, но, похоже, они мне не помогли.

Я должен использовать инструкции и регистры только от 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;
}

Я не могу идти дальше, так как не могу понять, как получить информацию из этого массива побитно. у меня есть это вики а также MSDN статья, которая объясняет схему.
Мой вопрос не очень хороший, но я был бы признателен за любую помощь или направление в этом отношении.

3

Решение

Я полагаю, что ваша проблема не в доступе к данным массива через индекс, как вы уже сделали b[0], b[1] и так далее. Вам нужно немного (!) Манипулировать. Вы должны замаскировать биты, которые вам не интересны, и интерпретировать то, что осталось; например

    (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-битным int- или шире)

Если вы хотите, например, Тип процессора, вам нужно:

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

и затем сдвиг (логический сдвиг) вправо от 3 «клевов» (12). Так

   (b[0] >> 12) & 3

даст вам число, представляющее тип процессора. (Число 3 равно 11 в базе 2, поэтому это правильная маска, чтобы выбрать только самые правые два бита).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]