2013-03-09 11 views
6

Ich möchte eine eigenständige C-Funktion erstellen, die eine Zeichenfolge druckt. Dies wäre Teil eines Betriebssystems, so dass ich stdio.h nicht verwenden kann. Wie würde ich eine Funktion erstellen, die die Zeichenfolge druckt, ohne dass ich stdio.h verwende? Müsste ich es in der Versammlung schreiben?Unabhängige C-Routine zum Drucken von Zeichenfolge

+0

zu lernen Was ist Ihr Betriebssystem? – md5

+1

hast du in stdio.h nachsehen? – JuanPi

+0

@JuanPi OP sagte, er kann 'stdio.h' nicht verwenden. – Rob

Antwort

3

Sie werden wahrscheinlich die Quelle zu stdio functions in der FreeBSD C-Bibliothek, die BSD-lizenziert ist, betrachten oder möglicherweise nur verwenden.

Um tatsächlich eine Ausgabe zu erzeugen, benötigen Sie mindestens eine Funktion, die Zeichen auf Ihr Ausgabegerät schreiben kann. Dazu rufen die Stdio-Routinen write auf, die einen Systemaufruf in den Kernel ausführt.

+0

Wenn OP möchte, dass es "Teil des Betriebssystems" ist, kann er den Betriebssystemaufruf, der es implementiert, vernünftigerweise nicht verwenden. –

+0

@IraBaxter: Ja. Das wäre Teil, den er umsetzen müsste. Ich dachte, es wäre offensichtlich, dass er die * BSD-Kernel nicht aufrufen würde. – sfstewman

+1

Sie sprechen im Grunde von der Portierung einer C-Bibliothek auf ein Hobby-Betriebssystem, was normalerweise der Fall ist, aber für das OP ein gutes Stück weiter. Er sollte wahrscheinlich durch Lesen/Schreiben direkt in den Videospeicher beginnen. –

4

Angenommen, Sie tun dies auf einem X86-PC, müssen Sie direkt in den Videospeicher unter der Adresse 0xB8000 lesen/schreiben. Für Farbmonitore müssen Sie ein ASCII-Zeichenbyte und ein Attributbyte angeben, die Farbe angeben können. Es ist üblich, beim Zugriff auf diesen Speicher Makros zu verwenden:

#define VIDEO_BASE_ADDR 0xB8000 
#define VIDEO_ADDR(x,y) (unsigned short *)(VIDEO_BASE_ADDR + 2 * ((y) * SCREEN_X_SIZE + (x))) 

Dann schreiben Sie Ihre eigenen IO-Routinen darum herum. Unten ist eine einfache Funktion, die ich aus einem Bildschirmpuffer geschrieben habe. Ich habe das verwendet, um eine grobe Scroll-Fähigkeit zu implementieren.

void c_write_window(unsigned int x, unsigned int y, unsigned short c) 
{ 
    if ((win_offset + y) >= BUFFER_ROWS) { 
    int overlap = ((win_offset + y) - BUFFER_ROWS); 
    *VIDEO_ADDR(x,y) = screen_buffer[overlap][x] = c; 
    } else { 
    *VIDEO_ADDR(x,y) = screen_buffer[win_offset + y][x] = c; 
    } 
} 

Um mehr über diese und andere osdev Themen finden Sie http://wiki.osdev.org/Printing_To_Screen

+3

Dies ist nur auf Systemen/Grafikkarten möglich, die einen "character-mapped" Videospeicher implementieren; außer für PC-Hardware, d. h. x86/x64-basierte Maschinen mit Grafikkarten, die ein BIOS vom "VGA" -Typ haben (nennen Sie dies, wenn Sie möchten, einen Gerätetyp), ist dies nicht der Fall; Die character-mapped Funktionalität auf PC-Grafikkarten wird vom BIOS und nicht von der Kartenhardware übernommen. Um dies beispielsweise auf einem RaspberryPI zu tun, müssten Sie einen _Framebuffer Device Driver_ schreiben. Die Verwendung der VGA-BIOS-Funktionalität unterscheidet sich daher (viel) nicht von der Verwendung eines Konsolentyptreibers über den Systemaufruf "write()". –

Verwandte Themen