Я пытаюсь получить функцию, которая выводит имя процессора / поставщика, но когда я пытаюсь это сделать, я получаю «GenuntellineI».
Вот функция:
void PrintProcessingDeviceType()
{
uint32_t regs[4];
#ifdef _WIN32
__cpuid((int*)regs, 0);
#else
asm volatile ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) : "a" (0), "c" (0));
#endif
std::cout << std::string((const char*)®s, 16) << std::endl;
}
Оба пути (с определенным _WIN32, а когда нет) приводят к возникновению этой ошибки. Это проблема с CPUID просто не правильно, я сделал что-то не так или как?
Почему вы ожидаете чего-то другого?
Обратитесь к руководствам Intel, если инструкция ведет себя не так, как вы ожидали.
Похоже, это особенность функции CPUID, см. http://www.microbe.cz/docs/CPUID.pdf (Раздел 2.1.1) для деталей. (Для свободного определения галтель; это не помечено как таковое, но легко пропускается.)
Он возвращает первые 4 байта в регистре EBX, следующие 4 байта в EDX и последние в ECX. Обратите внимание на две вещи: во-первых, результат EAX (regs[0]
) не содержит никаких символов названия модели, поэтому печатать его следует только с regs[1]
, Во-вторых, порядок двух последних регистров «обратный». Если вы поменяете местами соответствующие записи в вашем массиве, вы должны получить правильную строку (т.е. regs[2]
а также regs[3]
).
Вы можете рассматривать инструкцию CPUID как функцию, которая принимает значение аргумента, передаваемого через регистр EAX, т.е. То, что CPUID возвращает, зависит только от того, что находится в вашем EAX до выполнения CPUID.
В вашем случае до выполнения CPUID ваш EAX был равен 0. Таким образом CPUID возвращает базовую информацию о процессоре, которая была GenuinIntel
на твоей машине. Процессоры AMD вернутся AuthenticAMD
по тому же сценарию.
Поскольку каждый процессор немного отличается, поведение CPUID зависит от вашего CPU, поэтому после получения базовой информации о CPU вы должны использовать специфические функции CPUID, чтобы больше узнать о функциях CPU и т. Д. Для этого вам понадобится специальный документ CPU, описывающий CPUID.
anderas уже дал вам CPUID PDF для Intel. Здесь вы можете получить за AMD: