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
Antwort
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.
Wenn OP möchte, dass es "Teil des Betriebssystems" ist, kann er den Betriebssystemaufruf, der es implementiert, vernünftigerweise nicht verwenden. –
@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
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. –
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
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()". –
- 1. Padding eine schnelle Zeichenfolge zum Drucken
- 2. Formatieren einer mehrzeiligen Zeichenfolge zum Drucken auf einer Quittung
- 3. Batch - Drucken von Leerzeichen Anfang einer Zeichenfolge
- 4. Verwenden von gvim zum Drucken von Diffs?
- 5. Verwenden von Javascript zum Drucken von Bildern
- 6. Unabhängige Teilmenge von Cabal-Paketen
- 7. Locale-unabhängige Implementierung von Strtod
- 8. Unabhängige Reihen von ausgewählten Eingängen
- 9. Sass: Drucken zum Terminal
- 10. Programm zum Drucken von Zahlen in stdout
- 11. Druckbatch zum Drucken von mehreren Fließdokumenten erstellen
- 12. Webseiten zum Drucken von Medien - Lösungen?
- 13. Beste Möglichkeit zum Drucken von C#/.net?
- 14. Methode zum Drucken von Arraylist Returns []
- 15. Flash-Komponente zum Drucken von Graph
- 16. Oneliner zum Drucken von Zeichenketten in Hex?
- 17. Drucker automatisch zum Drucken von Duplikaten erzwingen
- 18. Optionen zum Drucken von Etiketten mit Barcode?
- 19. Verwendung von .getName zum Drucken eines Dateinamens
- 20. Erstellen einer Zeichenfolge in der Liste anstelle von Ganzzahl drucken
- 21. Eine unabhängige Kopie von UIBezierPath erstellen?
- 22. unabhängige Expression Auswertung in Winkel
- 23. Verwendung von grep oder awk zum Drucken zwischen einer Zeichenfolge und einer Variablen
- 24. Scala-Methode zum hübschen Drucken von XML direkt in einen java.io.Writer (keine Zeichenfolge)?
- 25. Verwenden einer Methode zum Konvertieren von Ganzzahl in Zeichenfolge und Drucken in TextView
- 26. Verwenden von CStdioFile zum Schreiben von Zeichenfolge
- 27. Plattform unabhängige Ressourcenverwaltung
- 28. RichTextBox rotierenden Text zum Drucken
- 29. Order-unabhängige Hash-Algorithmus
- 30. Printer_open() zum Drucken einer HTML-Ausgabe
zu lernen Was ist Ihr Betriebssystem? – md5
hast du in stdio.h nachsehen? – JuanPi
@JuanPi OP sagte, er kann 'stdio.h' nicht verwenden. – Rob