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) ); }