Sehr viel Spaß machte es mir, auf der untersten Ebene zu programmieren, in der maschinennahen Sprache Assembler. Es ist sehr aufwendig und mühsam.
Leider beherrschen nur noch wenige diese Programmiersprache, die immer noch den kompaktesten und damit auch schnellsten Code erzeugt, der auch effektiv in
ein C++- oder Delphi-Programm eingebaut werden kann.
Bei folgendem Beispiel kommt man sich zwar fast in die Steinzeit der Personal-Computer versetzt vor. Doch der Aufwand beschert am Schluss den Programmierer mit ungeahnten Erfolgserlebnissen.
Ein größeres Projekt war für mich, einen gängigen Computer ohne jegliches Betriebssystem zum Leben zu erwecken.
Im PC war – wie im ersten IBM-PC von 1981 - keine Festplatte, lediglich ein einfaches CD-Laufwerk war notwendig, um die CPU mit meinem
Maschinenprogramm zu füttern; ein einfaches, inzwischen veraltetes Diskettenlaufwerk hätte auch ausgereicht, wenn ich auf einige Beispiele verzichten würde.
Die gängigen Betriebssysteme waren nicht einmal in der Lage, die CD oder die Diskette zu lesen. Einige bezeichneten sie gar als defekt. Der Start war einfach, denn das BIOS stürzt sich wie gewohnt gierig auf
den ersten physischen Sektor (CHS 0,0,1), den Master-Bootsektor (MBR),
lädt diesen blitzschnell an eine fixe Adresse in den RAM-Speicher, um anschließend den Programm-Code auszulesen und auszuführen.
Für die weiteren Menüpunkte werden nach Bedarf zusätzliche Sektoren vom externen Speichermedium nachgeladen.
Der im MBR integrierte, nur 440 Byte große Code (Bootloader) musste von mir nun entsprechend manipuliert werden.
Ist dieser Schritt gelungen, kann man beliebig einfache Routinen scheibchenweise nachladen. Der Zugriff auf den MBR ist von den
modernen Betriebssystemen aus mit ihren FAT- oder NTFS-Partitionen nicht möglich. Nur beim Booten mit der Installations-DVD
ermöglicht das Installationsprogramm einen Zugang. Bei mir erfolgte er exklusiv über den BIOS-Interrupt 13h, Funktion 02h (mov ah,02 … int 13h)
oder direkt über den Controller-Port. Das schafft man nur mit Assembler-Programmierung. - Siehe ScreenShot meiner Startseite zu diesem Assembler-Programm!

Die mit hexadezimalen Werten gefüllte Tabelle zeigt einen üblichen Master-Boot-Record mit 512 (200h) Bytes. Der hexadezimal geschriebene 440 Bytes lange Bootloader-Code ist rot hervorgehoben. Der erste Maschinen-Befehl "33 C0" (XOR AX) setzt das AX-Register auf 0. Der nächste Befehl "8E D0" (MOV SS,AX) legt den Inhalt des AX-Registers auf das Stack-Segment. Der nächste Befehl besteht aus 3 Bytes "BC 00 7C" (MOV SP,7C00). Die Offset-Adresse wird in den Stack-Pointer geladen.
Stack-Pointer und Stack-Segment sprechen nun zusammen die physische Speicher-Adresse 0:7C00 an. Es folgt eine 1-Byte-Anweisung "FB" (STI), welche maskierte
Interrupts zulässt. Anschließend werden das Datensegment-Register (DS) und das Extra-Register (ES) mit Null belegt. ... usw.
Dieses kleine Programm muss für die beabsichtigte Aktion des Bootens ohne Betriebssystem entprechend abgeändert werden, damit die weiteren Programmteile zum gegebenen Zeitpunkt nachgeladen werden können. Die im MBR integrierte Partitionstabelle (64 Bytes), in der Tabelle mit grüner Schrift versehen,
einschließlich Signatur (2 Bytes), zweier unbenutzter Bytes und Volumeninformationen (4 Bytes)
können ebenfalls überschrieben werden, so dass ein kompletter Sektor mit 512 Bytes zur Verfügung steht.
Mehr möchte ich nicht verraten. Dem interessierten Leser sollten auch im digitalen Zeitalter des "Copy and paste" Gelegenheit zur Eigeninitiative und zur Vorbeugung
gegen die "Digitale Demenz" ermöglicht werden.
Was kann mein Assembler-Programm dann schließlich? Bringt es überhaupt etwas?
Diese Fragen kann man sich stellen, sie sind aber zweitrangig. Es geht lediglich darum, den fundamentalen Bootvorgang unter die Lupe zu nehmen. Neue Rechner sind mit dem BIOS-Nachfolger UEFI ausgestattet. Für die Überganszeit wird vielfach noch ein BIOS-Emulator angeboten. Interessant wäre es nun, auch für den UEFI-Modus eine entsprechende Assemblerroutine zu entwickeln. Mein in die Jahre gekommenes Assembler-Programm ist bzw. war jedenfalls zu Folgendem fähig:
- Es kann den Bootvorgang manipulieren
- Texte ausgeben, auch farblich hervorgehoben
- Einfache Graphiken aus ASCII-Elementen darstellen
- Den CMOS-Baustein auslesen und einige Daten zur Hardware interpretieren
- Eine einfache Melodie (Lied) abspielen über den Board-Lautsprecher
- Eine bildschirmfüllende Segment-Uhr zeigen, welche ständig aktualisiert wird
- Lauftexte veranlassen
- Eine Animation – blinkendes und hupendes Automobil - über den Bildschirm laufen lassen
- und einiges mehr.
Zugegeben, das ist insgesamt herzlich wenig und erst recht nicht ein Programm von großem Nutzen. Das schrittweise Programmieren dieser Routinen bietet
jedoch interessante Einblicke in die Arbeitsweise eines Computers und liefert trotz aller Mühe, langer Nächte und Unnütz letztendlich viel Spannung, Aufregung
und bei sich einstellendem Erfolg auch viel Spaß.
↑ Zum Seitenanfang