Hallo,
Mein Hauptproblem ist, dass ich keine Ahnung hab, wie man in Turbo C einen FAR-CALL erzeugt.
Gar nicht! Das ist Aufgabe des Compilers. Dazu muss man dem Compiler natürlich sagen was für ein Speicher-Model er benutzen soll. Wenn Du z.B. Large oder Huge auswählst werden die Funktionsaufrufe oft (also für Funktionen die als extern deklariert sind) als FAR-CALL generiert und in den betreffenden Funktionen als letztes ein RET
F eingebaut.
FAR CALLs haben den Nachteil das sie immer absolute Adressen benutzen (zumindest im RM) und die stehen zur Compile-/Link-Zeit noch nicht fest sondern werden erst beim laden des Executables reloziert. Normalerweise macht dass das OS aber in Deinem Fall müsste es der Assembler-Teil des Boot-Loaders erledigen.
Meinst Du, dass ich eine (als GLOBAL deklarierte) ASM-Funktion für FAR-JUMPS im Bootloader schreiben soll? Wenn sich mein OS in nem anderen Segment befindet, kann ich damit aber trotzdem nix anfangen.
Nein, ich meine das der Linker noch nicht die entgültigen Segmente in die FAR-CALLs einträgt, die weiß er einfach nicht. Das macht normalerweiser der EXE-Loader von DOS, das nennt sich dann
relozieren. Mit diesem Vorgang solltest Du Dich mal genauer beschäftigen. Da Du ein eigenes OS entwickeln willst musst Du das selber machen. Alternativ kannst Du Dich natürlich auch auf ein einzelnes Segment mit max. 64 kBytes beschränken.
Kennst Du den Unterschied zwischen .COM und .EXE bei DOS?
Den kenn ich. COM hat Daten- und Code im selben Segment, EXE bekommt verschiedene Segmente.
Fast. Der wesentliche Unterschied ist das .EXE relozierbar sind und .COM eben nicht.
Es geht nicht darum, dass mein OS Executables ausführen soll. Die Programme für mein OS schreib ich alle selber.
Diese 2 Sätze wiedersprechen sich. Erst soll Dein OS keine Programme (also die Dinge die nicht direkt fest im Kernel mit drin sind) ausführen können und dann willst Du diese Programme selber schreiben.
Mein OS soll nur eine FAT12-Diskette auslesen können. Nicht auf Disk schreiben, keine Dateien öffnen können, nur den Inhalt der Disk anzeigen.
Also quasi ein 'dir'-Befehl ausführen. Das ist wahrlich nicht schwer. Wenn Du dich auf die kurzen 8.3 Dateinamen beschränken kannst dann ist das in 1 oder 2 Tagen in C programmiert. Alle nötigen Infos finden man bei
Wikipedia.
MS-DOS ist in Assembler geschrieben
Das stimmt nicht! Selbst von der IO.SYS und MSDOS.SYS ist nur ein kleiner Teil in Assembler geschrieben. Die meisten Programme in MS-DOS in ganz normal in C (oder einer anderen Hoch-Sprache). HIMEM.SYS und EMM386.EXE könnten noch einen erheblichen Assembler-Anteil haben.
Assembler hat den Nachteil der Unportabilität und Unlesbarkeit - es sei denn, die Kommentare machen den Gutteil des Codes aus - und Hochsprachen haben Vorteile.
Da muss ich Dir entschieden wiedersprechen! Außer bei der Portabilität natürlich. Mann kann in Assembler sehr wohl eleganten, lesbaren und wartbaren Code schreiben. Natürlich muss man den etwas besser Kommentieren aber das bedeuten nicht das man mehr Kommentare als Befehle benötigt. Mann muss das als Programmierer nur wollen und dann auch konsequent durchziehen. Ordentlich programmieren
können muss man natürlich auch.
Grüße
Erik