Что означает эта строка в Python? - PullRequest
9 голосов
/ 12 июня 2009

Какую информацию о ЦП пытается получить этот код. Этот код является частью большего пакета. Я не программист на Python и хочу конвертировать этот код в C #.

from ctypes import c_uint, create_string_buffer, CFUNCTYPE, addressof
CPUID = create_string_buffer("\x53\x31\xc0\x40\x0f\xa2\x5b\xc3")
cpuinfo = CFUNCTYPE(c_uint)(addressof(CPUID))
print cpuinfo()

Если вы программист на Python и знаете, что делает этот код, это очень поможет мне.

Ответы [ 2 ]

24 голосов
/ 12 июня 2009

Выполняется следующий машинный код:

push bx
xor ax, ax
inc ax
cpuid
pop bx
retn

В основном он вызывает CPUID инструкцию CPU для получения информации о CPU. Поскольку EAX = 1, он получает информацию о процессоре и функциональные биты. Полученное 32-разрядное целое число затем отображается на экране, см. Статью в Википедии или эту страницу , чтобы декодировать результат.

EDIT : поскольку это то, что вы ищете, вот отличная статья о вызове CPUID в среде .NET / C # (вроде как с P / Invoke)

6 голосов
/ 12 июня 2009

В дополнение к ответу DrJokepu . Код Python, использующий модули ctypes, реализует следующий код C (/ hack):

char *CPUID = "\x53\x31\xc0\x40\x0f\xa2\x5b\xc3"; // x86 code
unsigned int (*cpuid)() = (unsigned int (*)()) CPUID; // CPUID points to first instruction in above code; cast it to a function pointer

printf("%u",cpuid()); // calling cpuid() effectively executes the x86 code.

Также обратите внимание, что это возвращает только информацию в EAX, и код x86, вероятно, должен был также выдвинуть / вытолкнуть значения ECX и EDX для безопасности.

...