GCC Inline-Assembler Fehler



  • Hallo,
    ich versuche gerade folgenden Code
    unter Dev-Cpp(gcc) zu compilieren, bekomme
    aber Fehlermeldungen:

    #include <iostream>
    
    using namespace std;
    int inkrement(int var) {
        asm ("mov eax,var");
        asm ("add eax,1");
        asm ("mov var,eax");
        return var;
        }
    int main(int argc, char *argv[])
    {
        int zahl = 9;
        cout << "Zahl vorher: " << endl;
        inkrement(zahl);
        cout << "Zahl inkrementiert: " << endl;
        system("PAUSE");
        return 0;
    }
    

    Und folgende Fehler:

    Assembler messages:
    too many memory references for mov' too many memory references foradd'
    too many memory references for `mov'

    Woher kommen diese Fehlermeldungen?

    0x0ERROR



  • Wenn du Inline Assembler verwenden willst, dann schau dir doch bitte auch an, wie die Syntax dazu aussieht. Das da oben hat jedenfalls nichts mit der gcc Syntax zu tun...



  • Kann man gcc auf Nasm-Syntax umschalten? Hab vergessen das
    beide unterschiedliche Syntaxen haben.

    0x0ERROR



  • 0x0ERROR schrieb:

    Kann man gcc auf Nasm-Syntax umschalten?

    nein, aber auf den Intel Syntax: -masm=intel



  • Nun habe ich noch das Problem, dass ich nicht
    auf die Variable von Assembler aus zugreifen
    kann. Wie kann ich auf die Variable zugreifen?

    0x0ERROR



  • Tu dir selbst einen Gefallen, und nimm eine richtigen Assembler!





  • Hier ein kleines Beispielprogramm von mir, das auf 64bit Linux den write-Syscall auslöst. Da kannst du dir die Lösung für dein Problem rauspicken:

    Word Write(Word fd, Word buffer, Word len)
    {
        Word result;
    
        asm
        (
            "movq %1, %%rax;"    // Set Syscall number.
            "mov %2, %%rdi;"     // Set target file descriptor.
            "movq %3, %%rsi;"    // Set buffer pointer.
            "movq %4, %%rdx;"    // Set buffer length.
            "syscall;"          // Enter kernel.
            "movq %%rax, %0;"    // Fetch result.
            : "=r"(result)
            : "r"(SYSCALL_WRITE_NO), "r"(fd), "r"(buffer), "r"(len)
            : "%rax", "%rdi", "%rsi", "%rdx"
        );
    
        return result;
    }
    

Anmelden zum Antworten