Ich habe mir die OS-Seite von Erhard Henkes angeshen...



  • Erhard Henkes schrieb:

    kannst du bitte den code genau darstellen? IST und das, was du für richtig hältst.

    Sorry, mein Fehler, hatte ganz vergessen, dass ja AT&T Syntax verwendet wird, bzw dass dort eben die Operanden im Vergleich zur Intel Syntax vertauscht sind. Von daher stimmt alles;-), hier trotzdem mal der Code den ich meinte. Aber wie gesagt, passt alles 😃 🙂

    inline void outportb(unsigned int port,unsigned char value)
    {
        asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value));
    };
    
    void update_cursor(int row, int col)
    {
        unsigned short position = (row*80) + col;
    
        // cursor HIGH port to vga INDEX register
        outportb(0x3D4, 0x0E);
        outportb(0x3D5, (unsigned char)((position>>8)&0xFF));
    
        // cursor LOW port to vga INDEX register
        outportb(0x3D4, 0x0F);
        outportb(0x3D5, (unsigned char)(position&0xFF));
    };
    

    Lg freeG


  • Mod

    Sorry, mein Fehler, hatte ganz vergessen, dass ja AT&T Syntax verwendet wird

    Na, dann ist doch alles bestens. 🙂



  • Jap, allerdings ist mir was anderes aufgefallen. Man muss doch als Limit der GDT fürs GDT-Register die Größe der GDT in Bytes-1 angeben. In deinem Tutorial wird allerdings einfach nur 24 Byte,also 3 Einträge verwendet und nicht 23 Byte. Wieso hast du das minus 1 weggelassen?

    Lg freeG



  • Strenggenommen ist das Limit damit ein Byte zu groß, aber weh tut das nicht besodners: Es wird ja immer nur auf ganze GDT-Einträge zugegriffen und damit hat der nächste immer noch sieben Bytes außerhalb des Limits liegen und kann deswegen nicht versehentlich benutzt werden.


  • Mod

    Danke für den Hinweis. 🙂



  • Erhard Henkes schrieb:

    Danke für den Hinweis. 🙂

    Kein Ding 😉 😃



  • fr33g schrieb:

    Erhard Henkes schrieb:

    kannst du bitte den code genau darstellen? IST und das, was du für richtig hältst.

    Sorry, mein Fehler, hatte ganz vergessen, dass ja AT&T Syntax verwendet wird, bzw dass dort eben die Operanden im Vergleich zur Intel Syntax vertauscht sind. Von daher stimmt alles;-), hier trotzdem mal der Code den ich meinte. Aber wie gesagt, passt alles 😃 🙂

    inline void outportb(unsigned int port,unsigned char value)
    {
        asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value));
    };
    
    void update_cursor(int row, int col)
    {
        unsigned short position = (row*80) + col;
    
        // cursor HIGH port to vga INDEX register
        outportb(0x3D4, 0x0E);
        outportb(0x3D5, (unsigned char)((position>>8)&0xFF));
    
        // cursor LOW port to vga INDEX register
        outportb(0x3D4, 0x0F);
        outportb(0x3D5, (unsigned char)(position&0xFF));
    };
    

    Lg freeG

    Nochmal zu dem Thema: Ich wusste doch dass ich mir aber sicher war, dass da irgendwas falsch ist... 😃
    Du schreibst im Tutorial an der oben genannten Stelle, man würde Befehle an die Ports 0x0E und 0x0F senden. Dies ist aber ja nicht der Fall, stattdessen sendet man Befehle an die Ports 0x3D4 und 0x3D5, wobei 0x0E und 0x0F nur zwei der vier Befehle sind, die an die genannten Ports gesendet werden.

    Lg freeG


  • Mod

    Thx. Habe den letzten Punkt korrigiert.



  • Erhard Henkes schrieb:

    Thx. Habe den letzten Punkt korrigiert.

    Habs gesehen 😉


  • Mod

    Danke für Hinweise zum Tutorial. 🙂


Anmelden zum Antworten