CPUID в архитектуре x88

Я пытаюсь получить доступ к информации, используя 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;
}

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


person Sasha    schedule 03.11.2012    source источник
comment
Я имею в виду iAPx8088. Извините, если я говорю это неправильно, поскольку я изучаю это.   -  person Sasha    schedule 03.11.2012
comment
У 8088 не было CPUID. Будучи первым поколением, он действительно не нуждался в нем...   -  person Bo Persson    schedule 03.11.2012
comment
у 8088/8086 не было процессора, это было намного позже. Я давно не смотрел на код cpuid, но они использовали самомодифицирующийся код для определения глубины буфера предварительной выборки, и именно так вы различали самые ранние процессоры x86 (8088 является частью этого семейства x86, это был 8086 с 8-битная внешняя шина).   -  person old_timer    schedule 04.11.2012


Ответы (1)


Я предполагаю, что ваша проблема не в доступе к данным массива через индекс, как вы уже сделали 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, поэтому это правильная маска для выбора только двух самых правых битов).

person ShinTakezou    schedule 03.11.2012
comment
Я многое получаю от этого. Мне до сих пор неясны параметры, которые мы отправляем в функцию, что происходит, когда мы меняем их при вызове функции, как b[0] и b[1], и т.д. - person Sasha; 03.11.2012
comment
с функцией вы имеете в виду __cpuid? Он заполняет массив b некоторыми данными в соответствии с входным параметром a. То, что я показал в ответе, - это случай, когда a == 1. b[0] содержит то, что я написал, b[1] другие данные и так далее. Вы должны интерпретировать код в соответствии со значением a (конечно, это не индекс b!). Просто другой набор информации/данных на каждой итерации. Вы выводите только первое int. - person ShinTakezou; 03.11.2012