This is a CPUID code.
It successfully compiled on Pelles C.
Code:
//Author - Niloy Mondal
//Reference - Intel Instruction Set Reference Volume 2
#include <stdio.h>
#include <conio.h>
int main()
{
char *strFeatures[32]={ "FPU - x87 FPU on Chip",
"VME - Virtual 8086 Enhancement",
"DE - Debugging Extensions",
"PSE - Page Size Extensions",
"TSC - Time Stamp Counter",
"MSR - RDMSR and WRMSR Support",
"PAE - Physical Address Extensions",
"MCE - Machine Check Exception",
"CX8 - CMPXCHG8B instruction",
"APIC - Advanced Programmable Interrupt Controller on Chip",
" ", //Reserved
"SEP - SYSENTER and SYSEXIT",
"MTRR - Memory Type Range Register",
"PGE - PTE Global Bit",
"MCA - Machine Check Architecture",
"CMOV - Condtional Move/Compare Instruction",
"PAT - Page Attribute Table",
"PSE-32 - Page Size Extension",
"PSN - Processor Serial Number",
"CLFSH - CFLUSH Instruction",
" ", //Reserved
"DS - Debug Store",
"ACPI - Thermal Monitor and Clock Control",
"MMX - MMX Technology",
"FXSR - FXSAVE/FXRSTOR",
"SSE- SSE Extensions",
"SSE2 - SSE2 Extensions",
"SS - Self Snoop",
"HTT - Hyper Threading Tech",
"TM - Thermal Monitor",
" ", //Reserved
"PBE - Pend. Brk. En"};
char VendorID[13];
unsigned char SteppingID;
unsigned char Model;
unsigned char Family;
unsigned char ProcessorType;
unsigned char Brand;
unsigned long VersionInfo;
unsigned long FeatureInfo;
_asm
{
mov eax,0
cpuid //CPUID Instruction
mov dword ptr [VendorID],ebx
mov dword ptr [VendorID+4],edx
mov dword ptr [VendorID+8],ecx
mov byte ptr [VendorID+12],0
}
//Show the Vendor ID. Should be "GenuineIntel" if the processor is Intel"/////////////
printf("Your processor is a %s\n",VendorID);
//Store all the required information in memory////////////////////////////////////////
_asm
{
mov eax,1
cpuid //CPUID Instruction
mov VersionInfo,eax //Store Version Information
mov FeatureInfo,edx //Store Feature Information
mov Brand,bl //Store Brand Information
}
//////////////////////////////////////////////////////////////////////////////////////
//Extract the SteppingID, model and family from the bit encoded VersionInfo and display
SteppingID = VersionInfo & 0x0F; //Stepping ID
Model = (VersionInfo & 0xF0)>>4; //Model
Family = (VersionInfo & 0x0F00)>>8; //Family
ProcessorType = (VersionInfo & 3000)>>12; //Processor Type
printf("Stepping ID : %5d\n",SteppingID);
printf("Model : %5d\n",Model);
printf("Family : %5d\n",Family);
//////////////////////////////////////////////////////////////////////////////////////
//Show the Processor Type/////////////////////////////////////////////////////////////
switch(ProcessorType)
{
case 0:
printf("Processor Type : Original OEM Processor\n");
break;
case 1:
printf("Processor Type : Intel OverDrive Processor\n");
break;
case 2:
printf("Processor Type : Dual Processor\n");
break;
case 3:
printf("Processor Type : Intel reserved\n");
}
//////////////////////////////////////////////////////////////////////////////////////
//Show the Computer Brand/////////////////////////////////////////////////////////////
printf("Your Computer Brand is :- ");
switch(Brand)
{
case 0x00:
printf("This Processor does not support the brand identification feature");break;
case 0x01:
printf("Intel Celeron processor");break;
case 0x02:
printf("Intel Pentium III processor");break;
case 0x03:
printf("Intel Pentium III Xeon or Intel Celeron processor");break;
case 0x04:
printf("Intel Pentium III processor");break;
case 0x06:
printf("Mobile Intel Pentium III processor-M");break;
case 0x07:
printf("Mobile Intel Celeron processor");break;
case 0x08:
printf("Intel Pentium 4 processor");break;
case 0x09:
printf("Intel Pentium 4 processor");break;
case 0x0A:
printf("Intel Celeron processor");break;
case 0x0B:
printf("Intel Xeon processor or Xeon processor MP");break;
case 0x0C:
printf("Intel Xeon processor MP");break;
case 0x0E:
printf("Mobile Intel Pentium 4 or Intel Xeon processor");break;
case 0x0F:
printf("Mobile Intel Celeron processor");break;
case 0x13:
printf("Mobile Intel Celeron processor");break;
case 0x16:
printf("Intel Pentium M processor");break;
default:
printf("Future Processor");
}
printf("\n---------------------Press any key to continue more----------------\n");
_getch();
/////////////////////////////////////////////////////////////////////////////////////
//Show the Processor Features////////////////////////////////////////////////////////
printf("Your Processor has the following Features:-\n");
for(long i=0;i<32;i++)
{
_asm xor ebx,ebx
_asm mov ebx,i
_asm bt FeatureInfo,ebx //"bt" is opcode to test a particular bit(on/off) in a string
//The bit number to test is provided as the second operand
//The result is stored in the carry flag
_asm jnc Feature_not_installed
printf("%s\n",strFeatures[i]);
Feature_not_installed:
;
}
//////////////////////////////////////////////////////////////////////////////////////
printf("************************Programmer - Niloy Mondal***********************");
return 1;
}
So I'd like to compile it on MinGW. Since I don't wanna use the AT&T syntax, I change the code a little bit
like these :
Code:
#include <stdio.h>
int main()
{
char *strFeatures[32] = {
"FPU - x87 FPU on Chip","VME - Virtual 8086 Enhancement",
"DE - Debugging Extensions","PSE - Page Size Extensions",
"TSC - Time Stamp Counter","MSR - RDMSR and WRMSR Support",
"PAE - Physical Address Extensions","MCE - Machine Check Exception",
"CX8 - CMPXCHG8B Instruction","APIC - Advance Programmable Interrupt Controller On Chip",
" ","SEP - SYSENTER and SYSECIT","MTRR - Memory Type Range Register","PGE - PTE Global Bit",
"MCA - Machine Check Architecture","CMOV - Conditional Move/Compare Instruction",
"PAT - Page Attribute Table","PSE-32 - Page Size Extension",
"PSN - Processor Serial Number","CFLUSH - CFLUSH Instruction",
"", "DS - Debug Store","ACPI - Thermal Monitor and Clock Control","MMX - MMX Technology",
"FXSR - FXSAVE/FXRSTOR","SSE - SSE Extensions","SSE2 - SSE2 Extensions",
"SS - Self Snoop","HTT - Hyper Threading Tech","TM - Thermal Monitor",
" ","PBE - Pend. Brk. En"};
long i;
char VendorID[13];
unsigned char SteppingID;
unsigned char Model;
unsigned char Family;
unsigned char ProcessorType;
unsigned char Brand;
unsigned long VersionInfo;
unsigned long FeatureInfo;
asm(".intel_syntax noprefix\n");
asm("mov eax,0\n");
asm("cpuid\n");
asm("mov dword ptr [VendorID],ebx\n");
asm("mov dword ptr [VendorID+4],edx\n");
asm("mov dword ptr [VendorID+8],ecx\n");
asm("mov byte ptr [VendorID+12],0\n");
printf("Your processor is a %s\n",VendorID);
asm("mov eax,1\n");
asm("cpuid\n");
asm("mov VersionInfo,eax\n");
asm("mov FeatureInfo,edx\n");
asm("mov Brand,bl\n");
SteppingID = VersionInfo & 0x0F;
Model = (VersionInfo & 0xF0) >> 4;
Family = (VersionInfo & 0xF00) >> 8;
ProcessorType = (VersionInfo & 3000) >> 12;
printf("SteppingID : %5d\n",SteppingID);
printf("Model : %5d\n",Model);
printf("Family : %5d\n",Family);
switch(ProcessorType)
{
case 0:
printf("Processor type : Original OEM processor\n");
break;
case 1:
printf("Processor type : Intel OverDrive processor\n");
break;
case 2:
printf("Processor type : dual processor\n");
break;
case 3:
printf("Processor type : Intel reserved\n");
break;
}
printf("Your computer brand is : ");
switch(Brand)
{
case 0x00:
printf("This procesor doesn't support the brand identification feature");
break;
case 0x01:
printf("Intel Celeron processor");
break;
case 0x02:
printf("Intel Pentium III processor");
break;
case 0x03:
printf("Intel Pentium III Xeon or Intel Xeon processor");
break;
case 0x04:
printf("Intel Pentium III processor");
break;
case 0x06:
printf("Mobile Intel Pentium III processor");
break;
case 0x07:
printf("Mobile Intel Celeron processor");
break;
case 0x08:
printf("Intel Pentium 4 processor");
break;
case 0x09:
printf("Intel Pentium 4 processor");
break;
case 0x0A:
printf("Intel Celeron processor");
break;
case 0x0B:
printf("Intel Xeon processor or Xeon processor MP");
break;
case 0x0C:
printf("Intel Xeon processor MP");
break;
case 0x0E:
printf("Mobile Intel Pentium 4 or Intel Xeon processor");
break;
case 0x0F:
printf("Mobile Intel Celeron processor");
break;
case 0x13:
printf("Mobile Intel Celeron processor");
break;
case 0x16:
printf("Intel Pentium M processor");
break;
default:
printf("Future processor");
}
printf("\n--------------- Press any key to continue ---------------\n");
getch();
printf("Your processor has the following features :\n");
for (i = 0; i < 32; i++)
{
asm("xor ebx,ebx\n");
asm("mov ebx,i\n");
asm("bt FeatureInfo,ebx\n");
asm("jnc Feature_not_installed\n");
printf("%s\n",strFeatures[i]);
asm("Feature_not_installed: \n");
}
return 1;
}
Try to compile using this command :
gcc -masm=intel cpuid.c -o cpuid
And these are the error messages :
Code:
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x5c): undefined reference to `VendorID'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x62): undefined reference to `VendorID'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x68): undefined reference to `VendorID'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x6e): undefined reference to `VendorID'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x91): undefined reference to `VersionInfo'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x97): undefined reference to `FeatureInfo'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x9d): undefined reference to `Brand'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x30e): undefined reference to `i'
C:/DOCUME~1/ADMINI~1.DIV/LOCALS~1/Temp/cceKbaaa.o:cpuid.c:(.text+0x315): undefined reference to `FeatureInfo'
collect2: ld returned 1 exit status
So how should I use Intel syntax on MinGW ?