Maschinensprache i8086/ Filter/ 09-I-I

Übersicht

Bearbeiten

Der gewählte Programmname soll zum Ausdruck bringen, dass am Zeilenanfang befindliche Tabulatoren (ASCII-Code 09) durch die Zeichenfolge "senkrechter Strich, Minuszeichen, neue Zeile, senkrechter Strich" ersetzt wird.

Das nachfolgende Programm kann auf folgende Weise verwendet werden:

  • Das Programm erwartet die Dateneingabe von Tastatur und gibt sie auf den Bildschirm aus. Es ist daher nur eine Verwendung als Filter sinnvoll. Das kann mit einem der folgenden Befehle erreicht werden:
  • In der Testphase ist es ratsam, dass die Ausgabe auf Bildschirm erfolgt:
       type quelle.txt | 09-i-i
       09-i-i <quelle.txt
  • Im praktischen Einsatz gibt es ebenfalls zwei gleichwertige Varianten:
       type quelle.txt | 09-i-i >ziel.txt
       09-i-i <quelle.txt >ziel.txt

Der interne Programmablauf ist folgender:

  • Die Standardeingabe wird in den Speicherbereich ab 1000 eingelesen.
  • Die eingelesenen Daten werden in den Speicherbereich der Zieldatei (ab 8000) umkopiert, wobei Tabulatoren (ASCII-Zeichen = 09) am Zeilenanfang ersetzt werden durch
  1. einen senkrechten Strich (ASCII-Code=124d = FCh)
  2. ein Minuszeichen
  3. Zeilenvorschub (bestehend aus den beiden Zeichen 0d und 0a)
  4. einen weiteren senkrechten Strich

Tabulatoren, die nicht am Zeilenanfang stehen, bleiben unverändert (Diese Tabulatoren können anschließend mit dem Programm 09-II weiter umgewandelt werden).

  • Der derart umgewandelte Text wird an die Standardausgabe geschrieben.

Quelldatei einlesen

Bearbeiten

Um diesen Abschnitt zu verstehen, sollten Sie sich vorher in Arbeit mit Dateien über Handles informiert haben. Das Einlesen erfolgt von Handle = 0 (Standardeingabe).

Datei durchsuchen und von 1000 nach 8000 kopieren

Bearbeiten

In diesem Programmabschnitt wird der ab Adresse 1000 eingelesene Text Byte für Byte analysiert und in den Speicherbereich ab 8000 umkopiert, wobei Tabulatoren sonderbehandelt werden. Im wesentlichen sind es dieselben Befehle wie im Kapitel 09-SP-V2.

Datei schreiben

Bearbeiten

Handle = 1 wird für die Standardausgabe verwendet.

Programm erzeugen und ausprobieren

Bearbeiten
  • Tippen Sie "debug ein und drücken Sie Enter
  • Tippen Sie jetzt den Befehl "a 100" ein und Enter. Der Debugger erwartet jetzt, dass Sie die Befehle eintippen (die blaue Spalte). Mit einem Trick können Sie sich die mühsame, fehlerträchtige Tipperei sparen.
    • Markieren Sie in der Tabelle den gesamten blauen Text, nicht mehr und nicht weniger.
    • Kopieren Sie die markierten Befehle in die Zwischenablage (Ctrl-C)
    • Wechseln Sie in das DOS-Fenster, wo der Debugger auf die Befehlseingabe wartet. Der Cursor blinkt hinter dem Minuszeichen-Prompt.
    • Klicken Sie mit der rechten Taste in die blaue Titelleiste (in der Eingabeaufforderung - debug steht).
    • Rollen Sie im aufklappenden Menü auf „Bearbeiten“ und klicken Sie auf „Einfügen“. Drücken Sie zum Abschluss noch ein- oder zweimal Enter, um die Befehlseingabe abzuschließen. Fertig!
IP Code
0100 90
0101 90
0102 90
0103 90
0104 90
0105 B80000
0108 89C3
010A BA0010
010D B90070
0110 B43F
0112 CD21
0114 730A
0116 B8024C
0119 CD21
011B 90
011C 90
011D 90
011E 90
011F 90
0120 89C1
0122 BE0010
0125 BF0080
0128 BB0000
12B 895CFE
012E AC
012F 49
0130 3C09
0132 7515
0134 8B5CFD
0137 81FB0D0A
013B 750C
013D B07C
013F AA
0140 B02D
0142 AA
0143 B80D0A
0146 AB
0147 B07C
0149 AA
014A E304
014C EBE0
014E 90
014F 90
0150 89F9
0152 BB0100
0155 B440
0157 BA0080
015A 29D1
015C CD21
015E 7305
0160 B8024C
0163 CD21
0165 B8004C
0168 CD21
Befehl
NOP
NOP
NOP
NOP
NOP
MOV AX,0000
MOV BX,AX
MOV DX,1000
MOV CX,7000
MOV AH,3F
INT 21
JNB 0120
MOV AX,4C02
INT 21
NOP
NOP
NOP
NOP
NOP
MOV CX,AX
MOV SI,1000
MOV DI,8000
MOV BX,0
MOV [[SI-2],BX
LODSB  
DEC CX
CMP AL,09
JNZ 0149
MOV BX,[SI-3]
CMP BX,0A0D
JNZ 0149
MOV AL,7C
STOSB
MOV AL,2D
STOSB
MOV AX,0A0D
STOSW
MOV AL,7C
STOSB
JCXZ 0150
JMP 012E
NOP
NOP
MOV CX,DI
MOV BX,0001
MOV AH,40
MOV DX,8000
SUB CX,DX
INT 21
JNB 0165
MOV AX,4C02
INT 21
MOV AX,4C00
INT 21
Manuell hinzugefügter Kommentar
; Einige NOP für Testzwecke
;
;
;
;
; Handle der Standardeingabe = 0
; AX = BX = Handle der Quelldatei
; AA Bereich zum Einlesen
; 7000 Byte von 1000 bis vor 8000)
; DOS-Funktion "Datei lesen"
;
; wenn CY dann Fehler
; Dateifehler beim Einlesen
; Abbruch mit ERRORLEVEL = 2
;
;
;
;
;
; Bytezahl der eingelesenen Datei
; AA Quelle
; AA Ziel
; zwei Byte vor dem Text
; vorsorglich =0 setzen
; Byte lesen
;
; Vergleich mit TAB
; Sprung wenn kein TAB
; vorangehende Zeichen prüfen
; steht dort CRLF?
; Sprung wenn kein Zeilenanfang
; | speichern
;
; - speichern
;
; 0D0A speichern (zusätzliche Zeile)
;
; | speichern
;
; Textende erreicht wenn CX=0
; nächstes Zeichen untersuchen
;
;
; EA des Ziels
; Handle der Standardausgabe
; Funktionscode „Datei schreiben“
; AA Ziel
; Bytezahl = EA - AA
; Datei schreiben
; Sprung wenn Schreiben fehlerfrei
; Fehler beim Schreiben
; Abbruch mit ERRORLEVEL 2
;
; reguläres Programmende

Mit dem Befehl "u" können Sie das Programm kontrollieren. Weil es nicht auf eine Bildschirmseite passt, brauchen Sie drei Befehle dafür:

u 100
u 120 14e
u 150 16a

Speichern vor dem Testen nicht vergessen! Das geht mit den folgenden drei Befehlen

-n 09-i-i.com
-r cx
: 6a
-w

Wenn Sie gern ein Programmlisting hätten, können Sie die Ausgabeumleitung nutzen. Tippen Sie ein:

debug 09-i-i.com >09-i-i.txt

und tippen Sie „blind“ die beiden Befehle „u 100 16a“ und „q“ ein.

Probieren Sie das Programm mit dem folgenden Befehl aus

09-i-i <quelle.txt 

Der umgewandelte Text erscheint auf dem Bildschirm. Wenn das Ergebnis richtig zu sein scheint, können Sie mit

09-i-i <quelle.txt >ziel.txt

den umgewandelten Text in die Datei ziel.txt schreiben und in Ruhe untersuchen.

Programmtest mit schrittweiser Abarbeitung

Bearbeiten

Ein Test mit schrittweiser Abarbeitung ist leider völlig unmöglich. Wieso?

debug 09-i-i.com <quelle.txt 

würde der Befehl zum Testen lauten. Das Problem: Die Quelldatei wird nicht wie erwartet an das zu testende Programm geleitet, sondern wird vom Programm DEBUG entgegengenommen. DEBUG erwartet allerdings Befehle und nicht irgendeinen Text. Im Ergebnis produziert DEBUG eine gewaltige Menge an Fehlermeldungen und hängt sich zum Schluss auf (außer Ihr Text endet mit "Neue Zeile, Buchstabe Q, Neue Zeile".

Wenn Ihr Programm die Standardeingabe einliest, sind also Tests nicht drin. Es bleibt Ihnen also nur eins übrig: Schreiben Sie auf Anhieb fehlerfreie Programme! Wenn in Ihrem Programm ein Fehler sein sollte, können Sie ihn nur durch Analyse der Datei „ziel.txt“ und scharfes Nachdenken finden, vorausgesetzt, es entsteht überhaupt eine Datei „ziel.txt“.

Die hier blau markierte Befehlsfolge ist noch nicht ausreichend getestet.