Maschinensprache i8086/ Filter/ 09-II

Übersicht Bearbeiten

Dieses Programm ist ein Filter. Eine von der Standardeingabe kommende Zeichenfolge wird an die Standardausgabe ausgegeben. Dabei werden alle in der Datei vorkommenden Tabulatoren durch || ersetzt (zwei senkrechte Striche, wie sie in Wiki-Tabellen verwendet werden). Vermutlich ist es sinnvoll, vorher mit dem Programm 09-I-I eventuell vorhandene Tabulatoren am Zeilenanfang zu ersetzen.

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 erfolgt Ausgabe auf Bildschirm:
       type quelle.txt | 09-ii
       09-ii <quelle.txt
  • Im praktischen Einsatz können ebenfalls beide Varianten verwendet werden:
       type quelle.txt | 09-ii >ziel.txt
       09-ii <quelle.txt >ziel.txt

Der interne Programmablauf ist folgender:

  1. Die Standardeingabe wird in den Speicherbereich ab 1000 eingelesen.
  2. Die eingelesenen Daten werden in den Speicherbereich der Zieldatei (ab 8000) umkopiert, wobei alle vorgefundenen Tabulatoren (ASCII-Zeichen = 09) in zwei senkrechte Striche (ASCII-Code=124d = FCh) umgewandelt werden.
  3. Der umgewandelte Text wird an die Standardausgabe ausgegeben.

Quelldatei einlesen Bearbeiten

Um diesen Abschnitt zu verstehen, sollten Sie vorher Arbeit mit Dateien (Handle) gelesen 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.
    • 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“. Fertig ist die Eingabe!
  • Geben Sie den Befehl "u 100" zur Kontrolle ein (aber eigentlich ist die Kontrolle überflüssig).
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 7305
0116 B8024C
0119 CD21
011B 3D0000
011E 7445
0120 89C1
0122 BE0010
0125 BF0080
0128 AC
0129 49
012A 3C09
012C 7503
012E B07C
0130 AA
0131 AA
0132 E31C
0133 EBF2
0135 90
0137 90
0138 90
0139 90
013A 90
013B 90
013C 90
013D 90
013E 90
013F 90
0140 90
0141 90
0142 90
0143 90
0144 90
0145 90
0146 90
0147 90
0148 90
0149 90
014A 90
014B 90
014C 90
014D 90
014E 90
014F 90
0150 89F9
0152 BB0100
0155 B440
0157 BA0080
015A 29D1
015C CD21
015E 7305
0160 B8024C
0163 CD21
0165 B80000
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 0116
MOV AX,4C02
INT 21
CMP AX,0000
JZ 0165
MOV CX,AX
MOV SI,1000
MOV DI,8000
LODSB 
DEC CX
CMP AL,09
JNZ 0131
MOV AL,7C
STOSB
STOSB
JCXZ 0150
JMP 0128
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
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,0000
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 (ab 1000 bis vor 8000)
; DOS-Funktion "Datei lesen"
;
; wenn CY dann Fehler
; Dateifehler beim Einlesen
; Abbruch mit ERRORLEVEL = 2
; gelesene Bytezahl = 0
; zum (regulären) Programmende
; Bytezahl der eingelesenen Datei
; AA Quelle
; AA Ziel
; Byte lesen
;
; Vergleich mit TAB
; Sprung wenn kein TAB
; durch | ersetzen
; | speichern
; | oder Zeichen speichern
;
;
; Die folgenden NOP-Befehle
; sind nur Lückenfüller.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; EA des Ziels
; Handle der Standardausgabe
; Code für Datei schreiben
; AA Ziel
; Dateilänge berechnen
; Datei schreiben
; Sprung wenn Schreiben fehlerfrei
; Fehler beim Schreiben
; Abbruch mit ERRORLEVEL 2
;
; reguläres Programmende

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

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

Probieren Sie das Programm mit dem folgenden Befehl aus

09-ii <quelle.txt 

Der umgewandelte Text erscheint auf dem Bildschirm. Mit

09-ii <quelle.txt >ziel.txt

wird der umgewandelte Text in die Datei ziel.txt geschrieben.

Programmtest mit schrittweiser Abarbeitung Bearbeiten

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

Wenn es möglich wäre, müsste der Befehl zum Testen des Filters so aussehen:

debug 09-ii.com <quelle.txt 

Das Problem: Das Programm DEBUG nimmt die Inputdatei entgegen, als ob es sich um Quelltext handeln würde. Die Datei gelangt nicht bis zu dem zu testenden Programm. 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 Tests also nicht möglich. 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 wird eine Datei „ziel.txt“ erzeugt, die man analysieren könnte).

Die hier blau markierte Befehlsfolge ist getestet, Sie können diese problemlos zur Erstellung eines Filterprogrammes benutzen.