Kri*_*ris 24 c++ cpu assembly x86-64
我想知道这里的人是否有一些很好的C++ CPUID实现示例,可以从任何托管的.net语言中引用.
此外,如果不是这种情况,我应该知道X86和X64之间的某些实现差异吗?
我想使用CPUID获取我的软件运行的机器上的信息(crashreporting等...),我想尽可能保持所有内容的兼容性.
我问的主要原因是因为我在编写可能是所有机器指令的内容时总是菜鸟,尽管我有关于CPU寄存器的基本知识等等...
在人们开始告诉我谷歌之前:我在网上找到了一些例子,但通常他们并不打算允许来自托管代码的交互,并且没有一个示例针对X86和X64.大多数示例似乎都是特定于X86的.
jco*_*and 43
访问原始CPUID信息实际上非常简单,这里有一个适用于Windows,Linux和OSX的C++类:
#ifndef CPUID_H
#define CPUID_H
#ifdef _WIN32
#include <limits.h>
#include <intrin.h>
typedef unsigned __int32 uint32_t;
#else
#include <stdint.h>
#endif
class CPUID {
uint32_t regs[4];
public:
explicit CPUID(unsigned i) {
#ifdef _WIN32
__cpuid((int *)regs, (int)i);
#else
asm volatile
("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
: "a" (i), "c" (0));
// ECX is set to zero for CPUID function 4
#endif
}
const uint32_t &EAX() const {return regs[0];}
const uint32_t &EBX() const {return regs[1];}
const uint32_t &ECX() const {return regs[2];}
const uint32_t &EDX() const {return regs[3];}
};
#endif // CPUID_H
Run Code Online (Sandbox Code Playgroud)
要使用它只是实例化类的实例,加载您感兴趣的CPUID指令并检查寄存器.例如:
#include "CPUID.h"
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
CPUID cpuID(0); // Get CPU vendor
string vendor;
vendor += string((const char *)&cpuID.EBX(), 4);
vendor += string((const char *)&cpuID.EDX(), 4);
vendor += string((const char *)&cpuID.ECX(), 4);
cout << "CPU vendor = " << vendor << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个维基百科页面告诉你如何使用CPUID:http://en.wikipedia.org/wiki/CPUID
编辑:#include <intrin.h>为每个评论添加Windows.
有一个全面的示例可以使用Visual Studio 2005或更高版本进行编译.对于Visual Studio 6,您可以使用此代替编译器instrinsic __cpuid:
void __cpuid(int CPUInfo[4], int InfoType)
{
__asm
{
mov esi, CPUInfo
mov eax, InfoType
xor ecx, ecx
cpuid
mov dword ptr [esi + 0], eax
mov dword ptr [esi + 4], ebx
mov dword ptr [esi + 8], ecx
mov dword ptr [esi + 12], edx
}
}
Run Code Online (Sandbox Code Playgroud)
对于Visual Studio 2005,您可以使用此代替编译器instrinsic __cpuidex:
void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
{
__asm
{
mov esi, CPUInfo
mov eax, InfoType
mov ecx, ECXValue
cpuid
mov dword ptr [esi + 0], eax
mov dword ptr [esi + 4], ebx
mov dword ptr [esi + 8], ecx
mov dword ptr [esi + 12], edx
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32303 次 |
| 最近记录: |