#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#if defined(_MSC_VER)
# include <intrin.h>
#elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID)
# include <cpuid.h>
#endif
static void print_bits(int bits, int newline)
{
size_t tip = CHAR_BIT * sizeof(int);
while (tip--) {
putc( ((bits >> tip) & 1) ? '1' : '0' , stdout);
}
if(newline)
putc('\n', stdout);
}
static void cpuid(uint32_t *eax, uint32_t *ebx, uint32_t *ecx,
uint32_t *edx) {
#if defined(_MSC_VER)
int cpu_info[4];
__cpuid(cpu_info, *eax);
*eax = cpu_info[0];
*ebx = cpu_info[1];
*ecx = cpu_info[2];
*edx = cpu_info[3];
#elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID)
uint32_t level = *eax;
__get_cpuid(level, eax, ebx, ecx, edx);
#else
uint32_t a = *eax, b, c = *ecx, d;
asm volatile("cpuid\n\t" : "+a"(a), "=b"(b), "+c"(c), "=d"(d));
*eax = a;
*ebx = b;
*ecx = c;
*edx = d;
#endif
}
int main(int argc, char const* argv[])
{
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
cpuid(&eax, &ebx, &ecx, &edx);
print_bits(eax, 1);
print_bits(ebx, 1);
print_bits(ecx, 1);
print_bits(edx, 1);
return 0;
}