Autor Thema: attributbyte,problem  (Gelesen 5187 mal)

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« am: 16. November 2009, 20:41 »
Hey, hab mich jetzt mal daran gewagt, nen kernel in c anzufangen. habe Leider ein problem. iwi kommt eine farbige vielfalt mit braunem hintergrund auf dem bildschirm, bei meinem code. Kann mir jemand viellecht helfen? was mache ich falsch, bei der speicherung des attributbytes.
Und was kann es für einen grund haben das sizeof() nicht funktioniert? habe wo jetzt 21 im quelltext in der schleife steht, vorher sizeof(text) stehen gehabt, aber anscheinend hat sizeof immer 5 zurückgegeben, egal wie lang text war.

// Bildschirmdefinition
#define DISPLAY_MEM_START 0xb8000
#define DISPLAY_MEM_END 0xB8FA0
// Konsolendefinition
#define KON_LINE_SIZE 0xA0
int static kon_line = 0;
void clear_screen(void)
{
char *videos = (char*) 0xb8000;
for(videos=(char*)DISPLAY_MEM_START; videos < (char*) DISPLAY_MEM_END;videos++)
     *videos=0;
}
void kprintf(char text[])
{
int cursor = 0;
char *video = (char*) DISPLAY_MEM_START;
for(cursor = 0; cursor < 21; cursor++)
{
video[(kon_line * KON_LINE_SIZE)+(cursor)] = text[cursor];
video[(kon_line * KON_LINE_SIZE)+(cursor+1)] = 0x7;
}
kon_line++;
}
void init(void)
{
clear_screen();
kprintf("Willkommen zu InfoOS");
}
« Letzte Änderung: 16. November 2009, 20:46 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #1 am: 16. November 2009, 21:07 »
Hm soweit ich das entziffern kann liegt das Hauptproblem auf den folgenden zwei zeilen.
video[(kon_line * KON_LINE_SIZE)+(cursor)] = text[cursor];
video[(kon_line * KON_LINE_SIZE)+(cursor+1)] = 0x7;

Nachdem du in einem ersten Schleifendurchlauf schön Zeichen und Attribut schreibst, überschreibst du das Attribut-Byte mit dem nächsten Zeichen im nächsten Schleifendurchlauf. Du könntest es mal so probieren:
video[(kon_line * KON_LINE_SIZE)+2*(cursor)] = text[cursor];
video[(kon_line * KON_LINE_SIZE)+2*(cursor+1)] = 0x7;

Wobei ich den Code nicht so genau angesehen habe, dass ich mit Sicherheit sagen könnte, dass das das einzige Problem ist.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #2 am: 16. November 2009, 22:25 »
Nee, dass kanns nicht sein, bzw. nicht nur. oO. habs schon ausprobiert.
cursor ist die aktuelle position in der zeile. also die spalte.
hm, warum sizeof nich funzt frag ich mich immer noch, iwas stimmt nicht, hm..
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #3 am: 16. November 2009, 22:36 »
Ah ich habe dir natürlich auch Mist geschrieben, das sollte folgendes heissen:
video[(kon_line * KON_LINE_SIZE)+2*cursor] = text[cursor];
video[(kon_line * KON_LINE_SIZE)+2*cursor+1] = 0x7;

Ah die Frage zu Sizeof habe ich übersehen:
Nein der Wert ist dort nicht 5 sondern 4. Die Beschreibung aus dem Standard: "The sizeof operator yields the size (in bytes) of its operand". Der Operand den das Sizeof da hat ist ein Pointer, und ein Pointer hat auf x86 4 Bytes. Was du willst ist ein strlen, was du dir allerdings selbst bauen muss, das kommt nicht vom Compiler.

 

Einloggen