Autor Thema: inline assembler [gcc -v 3.3.5]  (Gelesen 5092 mal)

ena

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« 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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 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
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Coffee

  • Beiträge: 470
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. May 2006, 19:11 »
probier mal

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


EDIT: man, da war der bluecode schneller ;-)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 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));
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen