Error: '(%dl)' is not a valid 32 bit base/index expression



  • Morgen miteinander,
    ich versuche mich derzeit an GCC-Inline-Assembly und komme nicht ganz zurecht.
    Folgender Code sollte funktionieren:

    void foo(char c) 
    {
        asm 
        (    "movb $0x03, %%ah \n\t" 
             "movb (%0), %%al  \n\t"
             : 
             : "r" (c)
        );
    }
    

    Als Fehlermeldung wird mir jedoch

    Error: '(%dl)' is not a valid 32 bit base/index expression
    

    ausgegeben.
    Ich möchte explizit auf den Inhalt von c zugreifen, und nicht auf die Adresse (das wär' dann ja nur %0, soweit ich weiß?)

    MfG und Danke im Voraus
    nval



  • PS: Falls das besser ins ASM-Forum passt (war schon spät heute, ich also leicht benebelt :P), bitte verschieben.
    Danke.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum Compiler- und IDE-Forum in das Forum Assembler verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Was willst Du genau machen? Schreibe zuerst deine Funktion in C und poste sie hier, dann versuche es in Assembler...



  • Die Funktion ist in C nicht wirklich zu formulieren. Ich muss bestimmte Register (hier al) mit bestimmten Werten für einen Interruptaufruf belegen, und dafür ist mir keine Möglichkeit in C bekannt (sonst würde ich die liebend gerne nutzen...).



  • nval schrieb:

    Die Funktion ist in C nicht wirklich zu formulieren. Ich muss bestimmte Register (hier al) mit bestimmten Werten für einen Interruptaufruf belegen, und dafür ist mir keine Möglichkeit in C bekannt (sonst würde ich die liebend gerne nutzen...).

    Dann mach die Funktion rein in Assembler, dazu eine Header-Datei mit "extern deine_func" und das war's. 🙂



  • Ack. Prinzipiell sollte man reine inline-Asm-Funktionen moeglichst vermeiden.

    Wenn du auf den Inhalt von c zugreifen willst, waere das nur %0 gewesen. c ist schliesslich kein Pointer und wird hier by value uebergeben.

    Ansonsten kannst du auch direkt im Input-Teil des asm templates angeben, in welche Register deine Variablen gepackt werden sollen.

    Sollte zB. so funktionieren (ungetestet)

    void foo(char c)
    {
        asm
        (    "movb $0x03, %%ah \n\t"
             :
             : "a" (c)
        );
    }
    

Anmelden zum Antworten