Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   type MP with C ? (http://www.go4expert.com/forums/type-mp-c-t17807/)

aska 1Jun2009 16:03

type MP with C ?
 
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


All times are GMT +5.5. The time now is 09:51.