RickyMa Wiskerlian Ответов: 2

Получить серийный номер cpuid с помощью C++


Я хочу получить идентификатор процессора из программы на c++. Это моя цель.

Вот мой код.

#include <stdio.h>
#include "stdafx.h"
#include <intrin.h>

int main(){
    int regs[4] = {0};
    char vendor[13];
    __cpuid(regs, 0);              // mov eax,0; cpuid
    memcpy(vendor, ®s[1], 4);   // copy EBX
    memcpy(vendor+4, ®s[2], 4); // copy ECX
    memcpy(vendor+8, ®s[3], 4); // copy EDX
    vendor[12] = '\0';
    printf("My CPU is a %s\n", vendor);
    return 0;
}





Но это дало мне некоторые ошибки, которые
1. stdafx. h: такого файла или каталога нет.
2. intrin. h: такого файла или каталога нет.

Что я уже пробовал:

Я нашел несколько ссылок

http://stackoverflow.com/questions/6491566/getting-the-machine-serial-number-and-cpu-id-using-c-c-in-linux
http://stackoverflow.com/questions/21642347/cpu-id-using-c-windows
http://stackoverflow.com/questions/5658975/c-get-processor-id
http://stackoverflow.com/questions/38323203/c-cpu-id-prosser-id-running-in-any-os-linux-window?noredirect=1#comment64061561_38323203
https://www.youtube.com/results?search_query=+проверить+процессор+ИД+с%2Б%2В
http://stackoverflow.com/questions/23103801/link-error-when-using-the-cpuid-in-intrin-h
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b80068ac-e17b-4f21-85fd-1d87fdc9b6b6/link-error-when-using-the-cpuid-in-intrinh?forum=msbuild
https://msdn.microsoft.com/en-us/library/ms724381(v=против 85). aspx
https://msdn.microsoft.com/en-us/library/ms724958(v=против 85). aspx
http://stackoverflow.com/questions/38323203/c-cpu-id-prosser-id-running-in-any-os-linux-window

Rajesh R Subramanian

Вы на Windows? Какую IDE вы используете?

RickyMa Wiskerlian

Да, яд.

Сейчас я использую dev-C++, но скоро перейду на visual studio 2012

2 Ответов

Рейтинг:
2

Jochen Arndt

Ваш опубликованный код будет работать только с компилятором Microsoft, который является частью Visual Studio, поскольку он использует специальный заголовочный файл Microsoft да.чфайл stdafx.ч) и специфический компилятор MS __cpuid, _ _ cpuidex[^] встроенная функция.

Если вы используете другой компилятор, вы должны проверить, обеспечивает ли он собственную поддержку инструкции CPUID x86. Если нет, то он может быть реализован с помощью встроенной сборки, которая опять же зависит от используемого компилятора (если поддерживается и синтаксис).

Например, в Linux есть определение в заголовочном файле арка/х86/включения процессора/АСМ/.ч который также может быть использован с Windows при использовании компилятора, использующего тот же синтаксис встроенной сборки, что и компиляторы Gnu:

 static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
                 unsigned int *ecx, unsigned int *edx)
{
    /* ecx is often an input as well as an output. */
    asm volatile("cpuid"
        : "=a" (*eax),
        "=b" (*ebx),
        "=c" (*ecx),
        "=d" (*edx)
        : "0" (*eax), "2" (*ecx)
        : "memory");
}


[РЕДАКТИРОВАТЬ]
Рабочий пример для компилятора GCC (протестирован с Ubuntu 14.04 LTS):
#include <stdio.h>
#include <string.h>

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
                 unsigned int *ecx, unsigned int *edx)
{
    /* ecx is often an input as well as an output. */
    asm volatile("cpuid"
        : "=a" (*eax),
        "=b" (*ebx),
        "=c" (*ecx),
        "=d" (*edx)
        : "0" (*eax), "2" (*ecx)
        : "memory");
}

int main()
{
    int eax, ebx, ecx, edx;
    eax = 0;
    native_cpuid(&eax, &ebx, &ecx, &edx);
    printf("EAX: %08X EBX: %08X ECX: %08X EDX: %08X\n", eax, ebx, ecx, edx);
    char vendor[13];
    memcpy(vendor, &ebx, 4);
    memcpy(vendor+4, &edx, 4);
    memcpy(vendor+8, &ecx, 4);
    vendor[12] = '\0';
    printf("%s\n", vendor);
    return 0;
}

[РЕДАКТИРОВАТЬ]


RickyMa Wiskerlian

Я не могу использовать ваш код.

RickyMa Wiskerlian

#include <iostream>
#include & lt;string.h>
использование пространства имен std;

статический встроенный пустоту native_cpuid(неподписанных int *еах, неподписанных int *регистры ebx, неподписанных int *Екб, неподписанных int *эдр)
{
/ * ecx часто является как входом, так и выходом. */
АСМ летучие("значение CPUID": "=а" (*еах), "=б" (*регистры ebx), "=с" (*Екб), "=д" (*эдр): "0" (*еах), "2" (*Екб): "память");
}

тап_п()
{
возвращает 0;
}

Jochen Arndt

См. мое решение для обновления.
Вы должны вызвать функцию, передающую необходимые аргументы.

RickyMa Wiskerlian

правильно ли это? опять же, я просто включаю iostream и string. h

RickyMa Wiskerlian

Я все еще не могу запустить, есть ли какая-нибудь версия c++

Jochen Arndt

Вы можете скомпилировать код C с помощью компилятора C++. Даже ваш первоначальный пример-простой С.

Поэтому вы должны предоставить необходимую информацию:
- Какой компилятор используется
- Как вызывается компилятор (аргументы / make file)
- Любые ошибки, вызванные компилятором или компоновщиком (полный текст сообщения об ошибке и строки исходного кода, в которых возникает ошибка)

Как я уже писал:
Использование встроенной сборки зависит от компилятора. Каждый компилятор имеет свой собственный синтаксис для встроенной сборки. Ваш пример предназначен для компилятора Microsoft, а мой-для компилятора Gnu (GCC, G++). Если вы используете любой другой, он не будет работать.

RickyMa Wiskerlian

Я использую Visual Studio Express 2012

Jochen Arndt

Тогда первая версия должна работать так, как сообщает ниже CPallini.

RickyMa Wiskerlian

Извините за поздний ответ из-за вакатино. Это может быть оправдано, но это не дает мне точного результата, который мне нужен, - это уникальный идентификатор cpuid.

Jochen Arndt

Вы можете передать значение в EAX, чтобы определить тип возвращаемой информации.
Видишь https://en.wikipedia.org/wiki/CPUID.

Рейтинг:
0

CPallini

Ваш код компилируется (и выполняется) нормально (я использую Visual Studio 2013 Express Edition и только что удалили stdafx.h включать).


RickyMa Wiskerlian

Я использую Visual Studio Express 2012, но он сказал, что memcpy не определен