| Zeile 13: | Zeile 13: | ||
Für Einsteiger gibt es ein [http://www.cheebi.de/c-kernel-tutorial.pdf Tutorial], welches beschreibt, wie man in den [[Protected Mode]] schaltet und in C geschriebenen Code ausführt. | Für Einsteiger gibt es ein [http://www.cheebi.de/c-kernel-tutorial.pdf Tutorial], welches beschreibt, wie man in den [[Protected Mode]] schaltet und in C geschriebenen Code ausführt. | ||
| + | == Eigenschaften von C == | ||
| + | === Assemblercode in C === | ||
| + | Während es möglich ist, den allergrößten Teil des Kernels in C zu schreiben, sind für einige wenige Aufgaben nach wie vor einige Zeilen Assemblercode notwendig. Es gibt dabei im Wesentlichen zwei Ansätze: | ||
| + | |||
| + | * <p>'''Inline-Assembler''': Assemblercode wird direkt in den C-Code eingebettet. Die konkrete Syntax dafür unterscheidet sich von Compiler zu Compiler, im Allgemeinen wird der Assemblercode durch das Schlüsselwort asm eingeleitet. Ein Vorteil dieser Methode ist, dass ein direkter Zugriff auch auf lokale C-Variablen möglich ist. Sie eignet sich daher für sehr kleine Codestücke besonders gut.</p><p>Siehe auch [[Inline-Assembler mit GCC]]</p> | ||
| + | * '''Externe Assemblerdatei''': Der Assemblercode wird in eine eigene Datei ausgelagert und vom C-Code als eigenständige Funktion aufgerufen. Die Übergabe von Parametern und des Rückgabewerts wird im Artikel [[Aufrufkonventionen]] beschrieben. | ||
| + | |||
| + | === Zeiger in C === | ||
| + | Zeiger sind einzigartig in C. Mit Zeiger kann wie bei Assembler auf den Arbeitsspeicher direkt zugreifen. | ||
| + | (Aber nicht auf Register) | ||
| + | Folgender Beispielcode verdeutlich dies: | ||
| + | /* Standardfunktionen für die Shell */ | ||
| + | /*********************************************************************************** | ||
| + | * Funktion Oneletter: Zeigt ein Buchstaben an einer bestimmten Posizion | ||
| + | * Groundcolour: Vordergrundfarbe | ||
| + | * Backcolour: Hintergrundfarbe | ||
| + | * Letter: Der Buchstabe | ||
| + | * Zeile: Die Zeile des Buchstaben | ||
| + | * Position: Welche Position der Buchstabe in der Zeile hat | ||
| + | *********************************************************************************** | ||
| + | */ | ||
| + | void OneLetter(unsigned char Groundcolour, unsigned char Backcolour, unsigned char Letter, unsigned char Zeile, unsigned char Position) | ||
| + | { | ||
| + | char Colour; | ||
| + | unsigned short int Atribut; | ||
| + | unsigned short int *Text = 0xB8000; | ||
| + | /* Prüfen ob überhaupt Farben möglich sind */ | ||
| + | if(Groundcolour > 16) | ||
| + | { | ||
| + | End(); | ||
| + | } | ||
| + | if(Backcolour > 16) | ||
| + | { | ||
| + | End(); | ||
| + | } | ||
| + | /* Zusammlegen der Farbe */ | ||
| + | Colour = Groundcolour * 16 + Backcolour; | ||
| + | Atrribut = Colour <<8; | ||
| + | Atrribut = Atrribut | Letter; | ||
| + | /* Adress für die richtige Positionierung finden */ | ||
| + | Text += y * 80 + x; | ||
| + | *Text = Atrribut; | ||
| + | } | ||
| + | <!-- Urheber ist Be59. Code steht unter BSD --> | ||
| + | Es handelt sich um den Code für die Textausgabe aus [[FiKe]]. | ||
| + | Die Zeile 3 beinhaltet einen Zeiger, der für die Textausgabe essentiell ist. Dieser Zeiger kann erhöht werden(Zeile 18) oder | ||
| + | auf dem zeigende Wert verändert werden(Zeile 19).<br> | ||
| + | Bei '''sehr''' fortgeschrittenen Betriebsystemen sollte jedoch auch ein Aspekt auf die Sicherheit getan werden(Nur nötig bei Möglichkeit zum Internet) | ||
== Bekannte C-Compiler == | == Bekannte C-Compiler == | ||
| Zeile 18: | Zeile 66: | ||
* [http://bellard.org/tcc/ tcc] (Tiny C Compiler) | * [http://bellard.org/tcc/ tcc] (Tiny C Compiler) | ||
* Borland [http://dn.codegear.com/article/20841 Turbo C] für DOS (16 Bit/Real Mode) | * Borland [http://dn.codegear.com/article/20841 Turbo C] für DOS (16 Bit/Real Mode) | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
== Weblinks == | == Weblinks == | ||