Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: ena am 21. May 2006, 18:59

Titel: inline assembler [gcc -v 3.3.5]
Beitrag 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:
Zitat

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
Titel: Re: inline assembler [gcc -v 3.3.5]
Beitrag von: bluecode am 21. May 2006, 19:10

BYTE inportb(BYTE _port)
{
BYTE value = 0x00;

__asm__ __volatile__("in %0, %al;" : : "m" (_port));

return value;
}


Ich war schneller :P
Titel: inline assembler [gcc -v 3.3.5]
Beitrag von: Coffee am 21. May 2006, 19:11
probier mal

__asm__ __volatile__("in %0, %al;" : : "m" (_port));


EDIT: man, da war der bluecode schneller ;-)
Titel: inline assembler [gcc -v 3.3.5]
Beitrag von: Jidder am 21. May 2006, 21:10
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));