Autor Thema: outportb in C  (Gelesen 17040 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #20 am: 15. January 2009, 23:44 »
Damit man es genau sagen kann, müßtest du noch Zeile 74 in der video.c herzeigen. Anscheinend hast du die Funktion dort anders definiert als in der Headerdatei. Und das geht natürlich nicht.
Ah shit. Beim Kopieren und Einfügen hierhin habe ich es bemerkt. Na ja, muss wohl wirklich so sein, dass man 1.000 mal schaut und erst beim 1.001. mal den Fehler findet. Gerade bei mir dürfte das nicht Untypisch sein.  :-D Aber vielen dank dir.
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 15. January 2009, 23:59 »
Naja, der Compiler sagt ja nicht umsonst, wo und was du falsch gemacht hast. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #22 am: 21. January 2009, 14:28 »
Ist zwar eigentlich ein anderes Thema, aber dafür wollte ich jetzt nicht ein neues aufmachen. Also folgendes, was ist eigentlich der Unterschied zwischen:

mov $0x10, %eax
und

mov $0x10, %%eax
Also % sagt ja dem gcc (bzw. dessem Assembler) dass es sich um ein Register handelt. Aber was sagen zwei %, also %%?

thx

bitmaster
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 21. January 2009, 16:04 »
Zwei %% verwendet man im Inline Assembler, wenn man Operanden (hinter den Doppelpunkten) angibt. Die Operanden werden dann mit %0, %1, ... durchnummeriert und man muss %% für Register verwenden, um diese von den Operanden zu unterscheiden. Wenn du keine Operanden angibst, musst du % für Register verwenden.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #24 am: 21. January 2009, 19:19 »
Zwei %% verwendet man im Inline Assembler, wenn man Operanden (hinter den Doppelpunkten) angibt. Die Operanden werden dann mit %0, %1, ... durchnummeriert und man muss %% für Register verwenden, um diese von den Operanden zu unterscheiden. Wenn du keine Operanden angibst, musst du % für Register verwenden.
Ah OK, vielen dank. Sagt mal wie mache ich eigentlich einen FAR-Jump? Also in Intel-Syntax lautet das ja jmp SEG:OFF aber wie siehts mit der AT&T-Syntax aus?

thx

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 21. January 2009, 19:27 »
ljmp Segment, Offset
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #26 am: 21. January 2009, 19:35 »
ljmp Segment, Offset
hmm also das funktioniert bei mir net:

asm ("ljmp 0x08, .1"
".1:");

Wofür steht eigentlich das l von ljmp?

thx

bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #27 am: 21. January 2009, 20:08 »
So, also so funktioniert es jetzt:

asm ("ljmp $0x08, $.1;"
     ".1:");

Aber ich würde gerne eine definierte Konstante nutzen anstatt den direkten Wert $0x08. Die Konstante ist so definiert:
#define CODE_SEL 1 << 3
Wenn ich jetzt aber


asm ("ljmp CODE_SEL, $1f;"
     "1:");

schreibe, dann sagt mir gcc

Zitat
Error: suffix or operands invalid for `ljmp'

Und wenn ich

asm ("ljmp $CODE_SEL, $1f;"
     "1:");

schreibe, dann sagt mir gcc

Zitat
Error: can't handle non absolute segment in `ljmp'

Also wie kann ich die Konstante einbauen?

vielen dank!!!
In the Future everyone will need OS-64!!!

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 21. January 2009, 20:34 »
Versuchs mal mit Klammern:
#define CODE_SEL  (1<<3)

asm(" ljmp $CODE_SEL, $.1");

Zitat
Wofür steht eigentlich das l von ljmp?
ich schätze mal für 'long'
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 21. January 2009, 20:40 »
Der Präprozessor ersetzt #defines nicht in Strings. Wär ja noch schöner. ;)

asm("ljmp %0, $.1" : : "i" (CODE_SEL)); könnte es tun (also als Immediate-Wert reingeben).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #30 am: 21. January 2009, 23:04 »
Der Präprozessor ersetzt #defines nicht in Strings. Wär ja noch schöner. ;)

asm("ljmp %0, $.1" : : "i" (CODE_SEL)); könnte es tun (also als Immediate-Wert reingeben).
Ah sry dass ich so spät antworte. Ich habe noch ein wenig Sport gemacht und geduscht (und natürlich auch noch meine Zähne geputzt). Das alles braucht ja Zeit. Aber danke, das funktioniert wunderbar. Jetzt kann ich mit ruhigem Gewissen schlafen gehen.  :-D

bitmaster
In the Future everyone will need OS-64!!!

 

Einloggen