CPP RELEASE [C++] Custom __cpuid() for GNU compilers

0pc0d3R

Active member
Joined
Feb 11, 2016
Messages
96
Reaction score
2
Location
Ukraine
Maybe it`s will be helpfull for some developers wich can`t find worked analog of cpuid realisation for GNU compilers, i`ve tried it in RAD Studio Berlin 10+ it`s get processor vendor name and id if it`s supported, else just get some static string like "intel geniune". Aspecially for Embarcarderos C++ Builder cuz it not supporting standart visual studio __asm and very specific.
Code:
std::string __cpuid()
{
    char VendorName[49] = {0};
    char VendorID[13] = {0};
    unsigned int a, b, c, d;
__asm xor EBX, EBX;
__asm xor ECX, ECX;
__asm xor EDX, EDX;
__asm mov EAX, 0x80000002;
__asm cpuid;
__asm mov a, EAX;
__asm mov b, EBX;
__asm mov c, ECX;
__asm mov d, EDX;
__asm mov DWORD PTR [VendorName + 0], EAX;
__asm mov DWORD PTR [VendorName + 4], EBX;
__asm mov DWORD PTR [VendorName + 8], ECX;
__asm mov DWORD PTR [VendorName + 12], EDX;
__asm mov EAX, 0x80000003;
__asm cpuid;
__asm mov DWORD PTR [VendorName + 16], EAX;
__asm mov DWORD PTR [VendorName + 20], EBX;
__asm mov DWORD PTR [VendorName + 24], ECX;
__asm mov DWORD PTR [VendorName + 28], EDX;
__asm mov EAX, 0x80000004;
__asm cpuid;
__asm mov DWORD PTR [VendorName + 32], EAX;
__asm mov DWORD PTR [VendorName + 36], EBX;
__asm mov DWORD PTR [VendorName + 40], ECX;
__asm mov DWORD PTR [VendorName + 44], EDX;
__asm mov EAX, 0x00000000;
__asm cpuid;
__asm mov DWORD PTR [VendorID + 0], EBX;
__asm mov DWORD PTR [VendorID + 4], EDX;
__asm mov DWORD PTR [VendorID + 8], ECX;
__asm mov EAX, 0x80000004;
    strcat(VendorName, " ");
    strcat(VendorName, VendorID);
    return string(VendorName);
}
 
Top