Mit inlineasm MOMCPUNAME in char schreiben



  • 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