1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

type MP with C ?

Discussion in 'C' started by aska, Jun 1, 2009.

  1. aska

    aska New Member

    Joined:
    Jul 31, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    hi everyone , i write a program in C to determine the type of microprocessor ,so for this task i include in c code source a assembler code ,,,,

    this my code
    Code:
    // Compile by BC++version 3.1
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    
    void main() {
      char VendorSign[13];   // for to store our vendorstring
      unsigned long MaxEAX;  //This will be used to store the maximum EAX
      char* Comp1[32];  //This is the array that will hold the short names
                        //for our features bitmap.
      unsigned long REGEAX, REGEBX, REGECX, REGEDX;
      int dFamily, dModel, dStepping, dFamilyEx, dModelEx;
      char dType[10];
      int dComp1Supported[32];
      int dBrand, dCacheLineSize, dLogicalProcessorCount, dLocalAPICID;
      asm {
        XOR EAX, EAX
        //An efficient alternatvie to MOV EAX, 0x0
        db 0fh,0a2h
        //=cpuID,This instruction will load our registers.
        MOV dword ptr [VendorSign], EBX
        //Copy the first 4 bytes in the VendorString from EBX.
        MOV dword ptr [VendorSign+4], EDX
        //Copy the next 4 bytes.
        MOV  dword ptr [VendorSign+8],   ECX
        //Copy the next 4 bytes.
        MOV  dword ptr MaxEAX,           EAX
        //EAX contains the maximum value to call CPUID with. Copy 
        //it to the MaxEAX variable.
      }
      VendorSign[12]=0;  
    //The last character in the VendorSign can be anything.
    //To make sure that it stops at the last character we add
    //a zero character at the end
      printf("Vendor string: %s\n", VendorSign);
      printf("Maximum EAX value: %i\n", MaxEAX);
      if(strcmp(VendorSign, "GenuineIntel")==0) {
        Comp1[0]="FPU";   //Floating Point Unit
        Comp1[1]="VME";   //Virtual Mode Extension
        Comp1[2]="DE";    //Debugging Extension
        Comp1[3]="PSE";   //Page Size Extension
        Comp1[4]="TSC";   //Time Stamp Counter
        Comp1[5]="MSR";   //Model Specific Registers
        Comp1[6]="PAE";   //Physical Address Extesnion
        Comp1[7]="MCE";   //Machine Check Extension
        Comp1[8]="CX8";   //CMPXCHG8 Instruction
        Comp1[9]="APIC";  //On-chip APIC Hardware
        Comp1[10]="";     //Reserved
        Comp1[11]="SEP";  //SYSENTER SYSEXIT
        Comp1[12]="MTRR"; //Machine Type Range Registers
        Comp1[13]="PGE";  //Global Paging Extension
        Comp1[14]="MCA";  //Machine Check Architecture
        Comp1[15]="CMOV"; //Conditional Move Instrction
        Comp1[16]="PAT";  //Page Attribute Table
        Comp1[17]="PSE-36"; //36-bit Page Size Extension
        Comp1[18]="PSN";  //96-bit Processor Serial Number
        Comp1[19]="CLFSH"; //CLFLUSH Instruction
        Comp1[20]="";     //Reserved
        Comp1[21]="DS";   //Debug Trace Store
        Comp1[22]="ACPI"; //ACPI Support
        Comp1[23]="MMX";  //MMX Technology
        Comp1[24]="FXSR"; //FXSAVE FXRSTOR (Fast save and restore)
        Comp1[25]="SSE";  //Streaming SIMD Extensions
        Comp1[26]="SSE2"; //Streaming SIMD Extensions 2
        Comp1[27]="SS";   //Self-Snoop
        Comp1[28]="HTT";  //Hyper-Threading Technology
        Comp1[29]="TM";   //Thermal Monitor Supported
        Comp1[30]="IA-64"; //IA-64 capable
        Comp1[31]="";     //Reserved
      }
      else if(strcmp(VendorSign, "AuthenticAMD")==0) {
        Comp1[0]="FPU";   //Floating Point Unit
        Comp1[1]="VME";   //Virtual Mode Extension
        Comp1[2]="DE";    //Debugging Extension
        Comp1[3]="PSE";   //Page Size Extension
        Comp1[4]="TSC";   //Time Stamp Counter
        Comp1[5]="MSR";   //Model Specific Registers
        Comp1[6]="PAE";   //Physical Address Extesnion
        Comp1[7]="MCE";   //Machine Check Extension
        Comp1[8]="CX8";   //CMPXCHG8 Instruction
        Comp1[9]="APIC";  //On-chip APIC Hardware
        Comp1[10]="";     //Reserved
        Comp1[11]="SEP";  //SYSENTER SYSEXIT
        Comp1[12]="MTRR"; //Machine Type Range Registers
        Comp1[13]="PGE";  //Global Paging Extension
        Comp1[14]="MCA";  //Machine Check Architecture
        Comp1[15]="CMOV"; //Conditional Move Instrction
        Comp1[16]="PAT";  //Page Attribute Table
        Comp1[17]="PSE-36"; //36-bit Page Size Extension
        Comp1[18]="";     //?
        Comp1[19]="MPC";  //MultiProcessing Capable
        Comp1[20]="";     //Reserved
        Comp1[21]="";     //?
        Comp1[22]="MIE";  //AMD Multimedia Instruction Extensions
        Comp1[23]="MMX";  //MMX Technology
        Comp1[24]="FXSR"; //FXSAVE FXRSTOR (Fast save and restore)
        Comp1[25]="SSE";  //Streaming SIMD Extensions
        Comp1[26]="";     //?
        Comp1[27]="";     //?
        Comp1[28]="";     //?
        Comp1[29]="";     //?
        Comp1[30]="3DNowExt"; //3DNow Instruction Extensions
        Comp1[31]="3DNow"; //3DNow Instructions 
      }
      if(MaxEAX>=1) {
        asm {
          MOV     EAX,                    1
          db 0fh,0a2h
          MOV     [REGEAX],               EAX
          MOV     [REGEBX],               EBX
          MOV     [REGECX],               ECX
          MOV     [REGEDX],               EDX
        }
        dFamily=((REGEAX>>8)&0xF);
        dModel=((REGEAX>>4)&0xF);
        dStepping=(REGEAX&0xF);
        dFamilyEx=((REGEAX>>20)&0xFF);
        dModelEx=((REGEAX>>16)&0xF);
        switch(((REGEAX>>12)&0x7)) {
          case 0:
            strcpy(dType, "Original");
            break;
          case 1:
            strcpy(dType, "OverDrive");
            break;
          case 2:
            strcpy(dType, "Dual");
            break;
        }
    
        for(unsigned long C=1, Q=0;Q<32;C*=2, Q++) {
          dComp1Supported[Q]=(REGEDX&C)!=0?1:0;
        }
    
    
        dBrand=REGEBX&0xFF;
        dCacheLineSize=((strcmp(Comp1[19], "CLFSH")==0)
    	&&(dComp1Supported[19]==1))?((REGEBX>>8)&0xFF)*8:-1;
        dLogicalProcessorCount=((strcmp(Comp1[28], "HTT")==0)
    	&&(dComp1Supported[28]==1))?((REGEBX>>16)&0xFF):-1;
        dLocalAPICID=((REGEBX>>24)&0xFF); //This works on P4 or later
      }
      printf("%s\n", dType);
      printf("Family %i, Model %i, Stepping %i\n", dFamily, dModel, dStepping);
      printf("Extended Family %i, Extended Model %i\n", dFamilyEx, dModelEx);
      printf("Supported flags: ");
      for(unsigned long Q=0;Q<27;Q++) {
        if(dComp1Supported[Q]) {
          printf("%s ", Comp1[Q]);
        }
      }
      printf("\n");
      printf("CacheLineSize: %i\n", dCacheLineSize);
      printf("Logical processor count: %i\n", dLogicalProcessorCount);
      printf("Local APIC ID: %i\n", dLocalAPICID);
    }
    
    so in resulr i have one error in 17 line ,undefined symbole EAX ,,,so perhap i need to include another header file or what? thanks before for all helps
     

Share This Page