Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: ena am 21. May 2006, 18:59
-
Hi @all,
ich habe folgende c-funktion mit inline-assembler befehlen:
BYTE inportb(BYTE _port)
{
BYTE value = 0x00;
asm("in %0, %al;" : : "m" (_port));
return value;
}
Nun bekomme ich vom gcc folgende fehlermedlung:
system.c:68: error: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
weiss jmd. wo der fehler liegt?
Wenn ich %1 benutze sagt er mir operandenanzahl ausserhalb des wertebereichs.
Am ende soll der wert auch noch auf value geschrieben werden und zurueckgegeben werden.
mfg ena
-
BYTE inportb(BYTE _port)
{
BYTE value = 0x00;
__asm__ __volatile__("in %0, %al;" : : "m" (_port));
return value;
}
Ich war schneller :P
-
probier mal
__asm__ __volatile__("in %0, %al;" : : "m" (_port));
EDIT: man, da war der bluecode schneller ;-)
-
So und jetzt noch die korrekte Antwort:
- Portnummern gehen von 0 bis 65535. BYTE reicht dafür nicht. Deine Funktion wird irgendwann an ihre Grenzen stoßen. Nimm irgendwas wie SHORT, WORD oder was auch immer du dafür hast.
- Ich denke mal die Funktionen soll auch irgendwann mal irgendwas außer 0x00 in value reinschreiben, oder? Tut sie aber nicht.
- "m" (_port) übergibt dem Befehl in eine Speicherstelle. Möglich sind aber nur eine Zahl zwischen 0 und 255 oder dx.
Mein Vorschlag deswegen:
__asm__ volatile ("in %%dx,%%al":"=a" (value):"d" (_port));