Mit inlineasm MOMCPUNAME in char schreiben



  • Hallo,
    Ich möchte mit c++ den Prozessornamen ermitteln und muss daher mit inline assembler die var MOMCPUNAME in eine c++var, wie char oder string schreiben schreiben lassen.
    Ich habe es versucht mit:

    char cpu;
        __asm("mov %eax,MOMCPUNAME");
        __asm("mov _cpu,%eax");
    

    und

    char tmp;
    __asm volatile("MOMCPUNAME" : "=A" (tmp));
    

    beim 1. code erhalte ich:

    [Linker Error] undefined reference to `MOMCPUNAME' 
    [Linker Error] undefined reference to `cpu'
    

    und beim 2. :

    Assembler messages: 
      `momcpuname'
    

    Oder ist die Variable momcpuname nur per Macroassembler ereichbar?
    Vielen Dank schon mal im vorraus.

    mfg choke



  • "MOMCPUNAME" gibts bei x86-Prozessoren als Assembler-Befehl nicht.
    Du musst den Assembler-Befehl CPUID (ab Pentium) mit Steuercode in eax aufrufen.
    Also die Referenz von CPUID lesen, das ist der Befehl der Feststellung des Typs der CPU dient.

    Kleines Beispiel in Intel-Syntax:

    #include <iostream>
    
    int main() 
    { 
        char vendor_string[13];
        vendor_string[12] = 0;
    
        __asm xor   eax, eax    // Steuercode == 0
        __asm cpuid
        // eax == max
        // max gibt an welchen maximalen Steuercode der Prozessor
        // vor Aufruf von von cpuid versteht.
        __asm mov   dword ptr vendor_string[0], ebx
        __asm mov   dword ptr vendor_string[4], edx
        __asm mov   dword ptr vendor_string[8], ecx
    
        std::cout << vendor_string << std::endl;
    
        // bei Pentium wird jetzt "GenuineIntel" ausgegeben
        // um an mehr Infos zu kommen cpuid mit Steuercode 1 aufrufen
        // weitere Infos dann z.B. in den Bits 0 bis 11 von EAX.
    }
    

    MfG



  • Ich nutze wxDev und daher gcc.
    deswegen musste ich as etw ändern:

    char vendor_string[13];
        vendor_string[12] = 0;
    
        __asm ("xor  eax, eax"
                "cpuid"
                "mov   dword ptr vendor_string[0], ebx"
                "mov   dword ptr vendor_string[4], edx"
                "mov   dword ptr vendor_string[8], ecx");
    
        wxString scpu = vendor_string;
    

    Als fehler kommt nun:

    too many memory references for `xor'
    

    aber danke schonmal.

    mfg choke



  • Öhm, vielleicht mal ein paar \n-s ans Zeilenende?

    asm ("bla\n"
         "blubb\n");
    

    Hintereinanderstehende Zeichenkettenliterale werden einfach zusammengezogen.



  • __asm ("xor  eax, eax\n"
                "cpuid\n"
                "mov   dword ptr vendor_string[0], ebx\n"
                "mov   dword ptr vendor_string[4], edx\n"
                "mov   dword ptr vendor_string[8], ecx");
    

    ich hab gelesen, dass man bei gnu ein _ vor die non-asm-variable machen muss.
    Aber wie soll ch das jetzt machen?!?
    so:

    __asm ("xor  eax, eax\n"
                "cpuid\n"
                "mov   dword ptr _vendor_string[0], ebx\n"
                "mov   dword ptr _vendor_string[4], edx\n"
                "mov   dword ptr _vendor_string[8], ecx");
    

    oder so:

    __asm ("xor  eax, eax\n"
                "cpuid\n"
                "mov   _dword ptr vendor_string[0], ebx\n"
                "mov   _dword ptr vendor_string[4], edx\n"
                "mov   _dword ptr vendor_string[8], ecx");
    

    es gibt noch mehr fehler:

    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s: Assembler messages:
    
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4349: Error: too many memory references for `xor'
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4351: Error: junk `ptr vendor_string[0]' after expression
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4351: Error: too many memory references for `mov'
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4352: Error: junk `ptr vendor_string[4]' after expression
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4352: Error: too many memory references for `mov'
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4353: Error: junk `ptr vendor_string[8]' after expression
    C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4353: Error: too many memory references for `mov'
    


  • nung gibts weniger Fehler:

    __asm ("xor  %eax, %eax\n"
                "cpuid\n"
                "mov   dword ptr vendor_string[0], %ebx\n"
                "mov   dword ptr vendor_string[4], %edx\n"
                "mov   dword ptr vendor_string[8], %ecx");
    

    Fehler:

    C:\DOKUME~1\blub\LOKALE~1\Temp/cc21aaaa.s:4351: Error: junk `ptr vendor_string[0]' after expression
    C:\DOKUME~1\blub\LOKALE~1\Temp/cc21aaaa.s:4352: Error: junk `ptr vendor_string[4]' after expression
    C:\DOKUME~1\blub\LOKALE~1\Temp/cc21aaaa.s:4353: Error: junk `ptr vendor_string[8]' after expression
    


  • weiß ja net obs zur allgemeinen Klärung beiträgt, habe mit ASM-Direktiven in C++ äußerst wenig zu tun aber das gibt die F.A.Q. her:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-41479.html



  • Checker&Murckser schrieb:

    weiß ja net obs zur allgemeinen Klärung beiträgt, habe mit ASM-Direktiven in C++ äußerst wenig zu tun aber das gibt die F.A.Q. her:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-41479.html

    Tut mir leid aber ich rall trotzdem nicht, wie ich mit dem "dword ptr vendor_string[0]" umgehen soll.
    Normalerweise müsste ich ja ein _ vor die var setzen.
    aer setzt geht das so nict.
    scheinbar wegen dem dword ptr und zu sowas hab ich noch kein beispiel gefunden.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • *push*

    kann keiner helfen?!?



  • Klar, schau dir die Links in dem verwiesenen FAQ-Eintrag an. Dort wird dir erklärt, wie du den GCC Inline-Assembler benutzen musst. So wie du es machst ist es fundamental falsch.



  • rüdiger schrieb:

    Klar, schau dir die Links in dem verwiesenen FAQ-Eintrag an. Dort wird dir erklärt, wie du den GCC Inline-Assembler benutzen musst. So wie du es machst ist es fundamental falsch.

    Die meisten sind für linux oder down.
    und in den wenigen anderen steht auch nicht, wie ich mit diesem dword ptr umgehe.



  • ob linux oder windows macht ja keinen Unterschied.



  • cpu: opteroN 144

    __asm__ __volatile__ (  "cpuid;"
                                 : "=a" (vendor_string[0]), "=b" (vendor_string[4]), "=c" (vendor_string[8]));
    

    ausgabe: q

    __asm__ __volatile__ (  "cpuid;"
                                 : "=b" (vendor_string[0]), "=c" (vendor_string[4]), "=d" (vendor_string[8]));
    

    ausgabe:

    __asm__ __volatile__ (  "xor  %%eax, %%eax;"
                                "cpuid;"
                                 : "=a" (vendor_string[0]), "=b" (vendor_string[4]), "=c" (vendor_string[8]));
    

    ausgabe: ■

    __asm__ __volatile__ (  "xor  %%eax, %%eax;"
                                "cpuid;"
                                 : "=b" (vendor_string[0]), "=c" (vendor_string[4]), "=d" (vendor_string[8]));
    

    ausgabe: A



  • *push*

    Bitte helft mal es funzt doch schon fast.



  • wo muss das dword hin?



  • *push*



  • *push* -.-


Anmelden zum Antworten