CPUID Funktion - kann jemand helfen?



  • Wollte mal CPUID Funktion ausprobieren, nach der suche habe ich eine Adresse gefunden http://www.openbg.net/sto/os/xml/cpuid.html wo alles beschrieben ist.
    ... wenn ich aber die Datei ausführen will bekomme ich WIN Error:

    Die Anweisung in "=x00401890" verweist auf Speicher in "oxccccccc"
    usw. blablablalalala

    Kompiler bzw. Linker gibt keinen Fehler/Warnung aus (als IDE benutze ich VC++)

    vielleicht kann jemand helfen?

    Prog40

    Hier das beispiel:

    #include <stdio.h>
    #include <string.h>

    void main() {
    char VendorSign[13]; //We need somewhere to store our vendorstring
    unsigned long MaxEAX; //This will be used to store the maximum EAX
    //possible to call CPUID with.

    unsigned long REGEAX, REGEBX, REGECX, REGEDX;
    int dFamily, dModel, dStepping, dFamilyEx, dModelEx;
    char dType[10];
    int dComp1Supported[32];
    int dBrand, dCacheLineSize, dLogicalProcessorCount, dLocalAPICID;

    unsigned long C;
    unsigned long Q;

    char* Comp1[32]; //This is the array that will hold the short names
    //for our features bitmap. The names added below is
    //valid for the Intel processors and many of them
    //are valid for other processors as well.

    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 (I made this short up, correct?)
    Comp1[20]=""; //Reserved
    Comp1[21]=""; //?
    Comp1[22]="MIE"; //AMD Multimedia Instruction Extensions (I made this short up, correct?)
    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 (I made this short up, correct?)
    Comp1[31]="3DNow"; //3DNow Instructions (I made this short up, correct?)
    }

    if(MaxEAX>=1) {
    _asm {
    MOV EAX, 1
    CPUID
    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(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 only works on P4 or later, must check for that in the future

    }

    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(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);
    }



  • 1. Nimm bitte Codetags. Sowas tut sich keiner an.
    2. Nimm nicht void main(), sondern int main(). void main() ist falsch.
    3. Setz MaxEAX auf 0, 1 oder was auch immer. Aber lass es nicht undefiniert.
    4. Nimm deinen Debugger und sag uns die Zeile, an der der Absturz auftritt.



  • Original erstellt von <Prog40>:
    **Wollte mal CPUID Funktion ausprobieren, nach der suche habe ich eine Adresse gefunden http://www.openbg.net/sto/os/xml/cpuid.html wo alles beschrieben ist.
    ... wenn ich aber die Datei ausführen will bekomme ich WIN Error:

    Die Anweisung in "=x00401890" verweist auf Speicher in "oxccccccc"
    usw. blablablalalala
    **

    Geh doch mal mitm Debugger durch, welche Zeile Ärger macht.



  • 4 Minuten zu langsam... :p



  • Hier noch einmal die Syntax:
    [cpp]
    #include <stdio.h>
    #include <string.h>

    int main() {

    char VendorSign[13]; //We need somewhere to store our vendorstring
    unsigned long MaxEAX=0; //This will be used to store the maximum EAX
    //possible to call CPUID with.

    unsigned long REGEAX, REGEBX, REGECX, REGEDX;
    int dFamily, dModel, dStepping, dFamilyEx, dModelEx;
    char dType[10];
    int dComp1Supported[32];
    int dBrand, dCacheLineSize, dLogicalProcessorCount, dLocalAPICID;

    unsigned long C;
    unsigned long Q;

    char* Comp1[32]; //This is the array that will hold the short names
    //for our features bitmap. The names added below is
    //valid for the Intel processors and many of them
    //are valid for other processors as well.

    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 (I made this short up, correct?)
    Comp1[20]=""; //Reserved
    Comp1[21]=""; //?
    Comp1[22]="MIE"; //AMD Multimedia Instruction Extensions (I made this short up, correct?)
    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 (I made this short up, correct?)
    Comp1[31]="3DNow"; //3DNow Instructions (I made this short up, correct?)
    }

    if(MaxEAX>=1) {
    _asm {
    MOV EAX, 1
    CPUID
    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(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 only works on P4 or later, must check for that in the future

    }

    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(Q=0;Q<27;Q++) {
    if(dComp1Supported[Q]) {
    printf("%s ", Comp1[Q]); DEBUGER - ERRORRRRRRRRRRRRRRR
    }
    }
    printf("\n");
    printf("CacheLineSize: %i\n", dCacheLineSize);
    printf("Logical processor count: %i\n", dLogicalProcessorCount);
    printf("Local APIC ID: %i\n", dLocalAPICID);
    }[/cpp]
    Der Debuger meckert mit "CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden" die stelle habe ich mit Fettenschrift gegenzeichnet.
    Danach springt der Debuger ins "output.c" Datei - Zeile 679

    while (i-- && *p)
      ++p;
      textlen = p - text.sz;    /* length of the string */
    

    mfg.
    Prog40



  • sag mal du hast zwar einen char pointer...

    aber wo allokierst du den speicher????

    es kann nur fehler geben....

    aber auch wenn du das richtig machst per
    Comp1 = (char*)new char[32];
    kannst du immer noch nur pro arrayelement EIN zeichen speichern und nicht einen string...



  • Das mit dem Speicher stimmt schon. Er schreibt ja Comp1[1] = "SSE" und nicht strcpy(Comp1[1], "SSE"). Das ist zwar nicht sehr elegant geschrieben, aber es sollte funktionieren.

    Der Grund, warum der Code nicht funktionieren kann, ist ein anderer:
    Du testet mit strcmp, ob VendorSign Intel oder AMD ist. Aber wo fragst du den Prozessor nach seinem VendorSign? 🙂

    In diese riesige if/elseif-Konstruktion mit dem VendorSign gehört übrigens auf jeden Fall noch ein einfaches else rein. Es gibt doch auch andere CPU-Hersteller als AMD und Intel. In diesem Fall würde dein Programm einfach abstürzen.

    [ Dieser Beitrag wurde am 09.05.2003 um 19:57 Uhr von cd9000 editiert. ]


Anmelden zum Antworten