9

此代码试图检索哪些 CPU 信息。此代码是更大包的一部分。我不是 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 程序员并且知道这段代码在做什么,那对我来说将是一个很大的帮助。

4

2 回答 2

24

它执行以下机器代码:

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

基本上它调用CPU 的CPUID指令以获取有关 CPU 的信息。由于 EAX=1,它获取处理器信息和功能位。然后将结果 32 位整数显示在屏幕上,请参阅 wikipedia 文章或此页面以解码结果。

编辑:既然这就是你要找的,这里有一篇关于在 .NET/C# 环境中调用 CPUID 的优秀文章(有点,使用 P/Invoke)

于 2009-06-12T11:12:23.347 回答
6

除了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 的值以确保安全。

于 2009-06-12T11:33:40.787 回答