Autor Thema: inline ASM (GCC)  (Gelesen 6662 mal)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« am: 01. March 2006, 15:33 »
Hallo,
ich bräuchte mal Hilfe bei inline ASM...
Ich brauch eine Funktion, die Sachen an Ports schicken kann (IN, OUT).
Kann mir da mal jemand helfen, weil ich bekomm das nicht hin (weil das ist ja GAS SAM Syntax)


Viele Grüße,
   Johannes

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. March 2006, 15:52 »
Hier gibt es ein englishes Tutorial über GCC Inline Asm.

Port-Funktionen könnten z.B. so aussehen:

void outportb(unsigned int port, unsigned char val)
{
__asm__ __volatile__("outb %b0,%w1"
:
: "a"(val), "d"(port));
}

unsigned char inportb(unsigned int port)
{
unsigned char ret_val;

__asm__ __volatile__("inb %%dx, %%al"
: "=a"(ret_val)
: "d"(port));

return ret_val;
}

Allerdings solltest du die nicht einfach kopieren, sondern auch verstehen ;) Am besten versuchst du mit Hilfe des Tutorials rauszukriegen was die einzelnen Teile machen.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. March 2006, 16:15 »
Ok, Danke ;)
eigentlich könnte ich die Funktion doch auch in ASM schreiben und dann dazu linken, oder?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. March 2006, 16:24 »
Ja, einfach nen neuen Asm-File erstellen, die beiden Funktionen hinzufügen und darauf achten dass sie auch exportiert werden (mit global). Diese Datei dann mit NASM in ein a.out oder elf oder so assemblen und einfach zum Rest linken. Also so in etwa:

; ports.asm
global inportb ; Funktion exportieren

inportb:
    pop edx       ; Port holen (Parameter, siehe C Funktionsprototyp)
    xor ah, ah   ; AH = 0
    inb al, dx     ; In DX steht das Port, nach AL kommen die Daten
    ret               ; Zurück zum C-Teil (Rückgabewert ist immer in EAX)


// ports.h
unsigned long inportb(unsigned long lPort);

Sorry falls da ein Fehler drin ist, ich hab einfach nur meine erste Idee dazu aufgeschrieben...

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. March 2006, 21:49 »
Zitat von: DarkThing
   pop edx       ; Port holen (Parameter, siehe C Funktionsprototyp)

nicht ganz. denn ganz oben auf dem stack liegt ja die ruecksprungadresse. der erste parameter liegt bei [esp + 4], der zweite bei [esp + 8], usw ...

so wuerd ich es machen:

asm:
bits 32
section .text

global inportb
inportb:
    mov dx, [esp + 4] ; portnummer ist 16 bit
    in al, dx
    ret


c:
unsigned char inportb(unsigned short port);
ist allerdings auch nicht getestet ;)
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen