Assembler in C



  • Hallo miteinander,

    ich habe mir eine kleine Funktion geschrieben, die mir den Wert des Stackpointers liefern soll. Hierzu verwende ich Assembler und C. Bekommen vom Compiler aber immer einen Fehler.
    Hier mal mein Code:

    unsigned long sp(void)
    {
    
    	__asm{movl %esp,%eax};
    
    }
    

    Folgende Fehlermeldung gibt mir der Compiler:
    Inline-Assembler: Syntaxfehler in 'Opcode'; 'MOD' gefunden

    Ich hab den Assembler Code auch schon mit normalen Klammern und zusätzlich mit Anführungszeichen vollgeladen, hat aber alles nix gebracht.

    Danke für Eure Hilfe



  • welchen Compiler verwendest du? manche Compiler halten sich nicht ganz an die Standards 😉



  • Borland TC++ 3.0, der sagt mir aber das er den Befehle __asm nicht kennt
    und Microsoft Visual C++. Beim MS-Compiler kommt die oben gepostete Fehlermeldung.

    Ist mein Syntax vom Prinzip her richtig?



  • ups hab jetzt erst gesehen, dass du eh schon etwas verwendest was nicht Standardkonform ist...

    zuwas sind die Modulozeichen notwendig?

    warum nicht:

    unsigned long sp(void)
    {
    
        __asm{movl esp,eax};
    
    }
    


  • wenn ich ehrlich bin muß ich gestehen, dass ich die Funtion geklaut hab, weil ich mich in Assembler noch so gut wie garnicht auskenn. Wenn ich die Modulo zeichen weglass, hab ich aber noch mehr Fehlermeldungen:

    -warning C4405: 'esp' : Bezeichner ist ein reserviertes Wort
    -Inline-Assembler: Syntaxfehler in 'Opcode'; 'esp' gefunden

    Der Opcode ist der der Code der zwischen meinen { } steht? Wo ist dann da der Syntaxfehler?

    Wenn ich das ganze so schreib:

    unsigned long sp(void)
    {
    	__asm{"movl esp,eax"};
    }
    

    dann sagt der Compiler "error C2400: Inline-Assembler: Syntaxfehler in 'Opcode'; 'bad token' gefunden"



  • lass die Gänsefüsschen weg 😉



  • die gänsefüsschen waren nur zum testen, ohne gänsefüsschen gibts die fehlermeldung die ich schon gepostet hab.

    -warning C4405: 'esp' : Bezeichner ist ein reserviertes Wort
    -Inline-Assembler: Syntaxfehler in 'Opcode'; 'esp' gefunden



  • asm syntax ist bei jedem compiler anders, siehe doch mal ins handbuch.

    beim vc++ würde es so aussehen:

    __asm mov esp, eax;
    


  • @zubaasa
    Schau dir mal die verschiedenen Assembler-Dialekte an. Generell sind hier zwei von Bedeutung, Intel und AT&T.

    Intel

    mov eax, esp
    

    AT&T

    movl %esp, %eax
    

    Wie du Assembler in deinen Code einbettest, da hat jeder Compiler seine eigenen Vorstellungen. Beim MSC schreibst du zB einfach __asm davor oder bettest es in __asm {...} ein. Beim GCC zB sieht das wie folgt aus:

    asm ("...");
    


  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Compiler-Forum verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Danke, genau da lag das Problem mit

    mov eax,esp;
    

    funktioniert es einwandfrei.


Anmelden zum Antworten