Maschinensprache i8086/ Hallo Welt

Theorie:  EinleitungMaschinenspracheAssemblerZahlensystemeRAM-AdressenBWSDebugCPU-RegisterEinfache BefehleStringbefehleInterruptsI/O-Ports
Versuch:  BWS1BWS2Hallo WeltBootsektorMBR
Nützlich: BefehlslistePAUSEFilter
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 BWSBearbeiten

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!