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 formov' too many memory references for
add'
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; }