Maschinensprache i8086/ Hallo Welt
Theorie:
Einleitung – Maschinensprache –
Assembler – Zahlensysteme –
RAM-Adressen – BWS – Debug –
CPU-Register – Einfache Befehle – Stringbefehle – Interrupts –
I/O-Ports
Versuch:
BWS1 – BWS2 –
Hallo Welt – Bootsektor – MBR
Nützlich:
Befehlsliste – PAUSE – Filter
Analyse:
Bootloader
Es scheint Tradition zu sein, ein Programmbeispiel "Hallo Welt" zu verfassen. Da wollen wir nicht abseits stehen. Es gibt mehrere Möglichkeiten dafür:
- Direktes Beschreiben des BWS. Das haben wir in einer einfachen Form schon gemacht.
- Nutzung einer BIOS-Funktion für die Zeichenausgabe
- Nutzung einer DOS-Funktion für die Zeichenausgabe
Direktes Beschreiben des BWS
[Bearbeiten]Der Text "Hallo Welt" wird ab der (willkürlich gewählten) Adresse 141 bereitgestellt. Vorangestellt auf Platz 140 steht die Länge des Hallo-Welt-Textes.
Nach dem Setzen des ES-Registers wird zunächst der Bildschirm gelöscht, genauer: Alle 25 Zeilen * 80 Zeichen werden mit Leerzeichen beschrieben. Anschließend wird Register DI auf die Mitte des Bildschirms gesetzt: 12 Zeilen * 80 Zeichen vom Bildschirmanfang + 32 Zeichen an Zeilenanfang = 992. Dieser Wert wird verdoppelt (weil sich im BWS zu jedem ASCII-Code ein Farbcode gesellt). Die dezimale 1984 ergibt hex 7C0.
Nun wird der Text Byte für Byte ab Adresse 141 in den BWS kopiert. Genauer: Mit dem LODSB Befehl wird ein Textbyte nach AL gelesen, mit STOSW werden zwei Byte (AL=ASCII, AH=Farbe) in den BWS geschrieben. Das Ganze wird CX mal wiederholt. Fertig! Mit MOV AX,4C00 und INT 21 erfolgt der übliche Rücksprung zum Betriebssystem.
Beginnen wir mit der Programmeingabe. Tippe den Befehl "debug" ein. Gib "a 100" ein und tippe den blau markierten Teil des folgenden Listings ein:
xxxx:0100 B800B8 MOV AX,B800 ; Beginn Bildwiederholspeicher (Text) xxxx:0103 8EC0 MOV ES,AX ; Das Extrasegment wird benutzt xxxx:0105 BF0000 MOV DI,0000 ; Startadresse = Null xxxx:0108 B95000 MOV CX,07D0 ; Zeichenzahl auf Bildschirm: 80 Spalten * 25 Zeilen = 2000d = 7D0h xxxx:010B B82007 MOV AX,0720 ; Leerzeichen in weiß (Bei einem unsichtbaren Zeichen ist die Farbe beliebig) xxxx:010E AB STOSW ; Speichern sowie CX = CX – 2, DI = DI + 2 xxxx:010F E2FD LOOP 010E ; wiederholen solange CX > 0 xxxx:0111 BFC007 MOV DI,07C0 ; etwa die Mitte des Bildschirms xxxx:0114 BE4101 MOV SI,0141 ; Anfangsadresse des Textes xxxx:0117 8A0E4001 MOV CL,[0140] ; Zeichenanzahl xxxx:011B B500 MOV CH,00 ; High Byte von Zeichenanzahl xxxx:011D B407 MOV AH,07 ; Farbe: 07 = weiß xxxx:011F AC LODSB ; Byte lesen xxxx:0120 AB STOSW ; Word schreiben xxxx:0121 E2FC LOOP 011F ; wiederholen bis Zeichenzahl erreicht xxxx:0123 B8004C MOV AX,4C00 ; Programm beenden mit ERRORCODE 0 xxxx:0126 CD21 INT 21 ; Rückkehr zum Betriebssystem xxxx:0128
Jetzt wollen wir das eingegebene Programm abspeichern. Dazu sind drei Schritte notwendig:
- Ein Namen für das Programm muss festgelegt werden (hier: hallow.com).
- Die Länge des Programms muß ermittelt und ins CX Register geschrieben werden. Das Programm beginnt ab 0100 und endet hinter dem auf 141 beginnenden Text. Eine Länge von 50 ist ausreichend.
-r cx Programmlänge eingeben 50 Länge = 50 n hallow.com Namen für die Datei festlegen w write = Schreiben q quit = debug beenden
Im aktuellen Verzeichnis finden Sie jetzt eine neue Datei "hallow.com", 80 Byte (=50h) Byte groß ist. Mit Eingabe des Befehls "hallow" könnten Sie jetzt das neue Programm ausprobieren, aber es wird komische Zeichen auf den Bildschirm schreiben. Der Grund: Ab Adresse 140 wird ein Text erwartet, aber dort stehen bisher nur Zufallszahlen. Bleibt also die schwierige Arbeit, den Text "Hallo Welt" nach ASCII zu konvertieren und ab Adresse 141 eingegeben werden. Das ist mühsam. Aber mit einem Trick geht es ganz einfach:
- Gib den Befehl "debug hallow.com Hallo Welt!" ein.
- Tippe "d 80 8f" ein. Du siehst den Text mit vorangestellter Zeichenzahl:
xxxx:0080 0C 20 48 61 6C 6C 6F 20-57 65 6C 74 21 00 00 00 . Hallo Welt!...
- Mit dem Befehl "m 80 8f 140" kopierst du den Text nach Adresse 140. Tippe zur Kontrolle "d 140 14f" ein:
xxxx:0140 0C 20 48 61 6C 6C 6F 20-57 65 6C 74 21 00 00 00 . Hallo Welt!...
- Nun speichere das Programm erneut. Fertig!