8086 Assembler (MS-DOS):
Beispiel Filterprogramm UML zur Codewandlung von deutschen Umlauten

Mit „D”, „W” und „H” ist der beim Programmaufruf mitgegebene Parameter D, W oder H gemeint. Er bestimmt die Art der Umcodierung.
  • D setzt die deutschen Umlaute vom Windows-Code in DOS-Code (ASCII) um,
  • W setzt die deutschen Umlaute vom DOS-Code (ASCII) in Windows-Code um,
  • H setzt die benannten deutschen Umlaute aus dem Windows- und dem DOS-Code (ASCII) in die HTML-Umschreibung mit &...; um.

Das Programm muss mit einem Parameter aufgerufen werden. Der Parameter bezeichnet den Zielcode. Wenn kein oder ein falscher Parameter eingetippt wurde, erscheint ein Hilfstext auf dem Bildschirm.

Es handelt sich um ein Filterprogramm: Gelesen wird von Standardeingabe, geschrieben wird nach Standardausgabe.

Die Codeumwandlung erfolgt mittels zweier Tabellen. Im Programm heißen sie „umlaute” und „webuml”:

comment #
Umlauttabelle, enthält Windows- und MS-Dosumlaute äöüßÄÖÜ jeweils nebeneinander
zuerst Windows, dann MS-DOS
          ä  ö  ü  Ä  Ö  Ü  ß
Windows:  e4 f6 fc c4 d6 dc df
MS-DOS:   84 94 81 8e 99 9a e1
Die benannten HTML-Zeichen ergeben 6 Bytes lange Umschreibungen. Nur die
Umschreibung fuer sz ist 7 Bytes lang.
#

umlaute  db 0e4h,84h,0f6h,94h,0fch,81h,0c4h,08eh,0d6h,99h,0dch,9ah,0dfh,0e1h
webuml   db "äöüÄÖÜß"

Die nachfolgende Tabelle veranschaulicht das Prinzip der Umcodierung. Kernstück ist die Tabelle „umlaute”. Sie enthält für jeden deutschen Umlaut nebeneinander den Code des Zeichens in Windows und in DOS. Je nach Umsetzrichtung zwischen Windows- und DOS-Code wird dadurch der Zielcode des Zeichens unmittelbar neben seinem Quellcode gefunden.

Auch wenn man vom Umlaut in die längere Umschreibung für HTML umsetzen möchte, wird diese Tabelle verwendet. Das Programm verarbeitet in diesem Fall sowohl DOS- als auch Windows-Code. Dazu passt die Tabelle „umlaute” ausgezeichnet. Durch Umrechnen der im Register BX ermittelten Fundstelle wird die Position der HTML-Umschreibung in der Tabelle „webuml” bestimmt. Die Umrechnung wird dadurch erleichtert, dass bis auf die Umschreibung für „ß” die Umschreibungen genau 6 Bytes lang sind.

Die gemeinsame undifferenzierte Umwandlung beider Codes (Windows und DOS) in HTML-Umschreibung ist eine Schwachstelle des Programms. Die Schwachstelle macht sich bei Verarbeitung von Sonderzeichen aus denjenigen 7 Sonderzeichen bemerkbar, die im jeweils anderen Code für die 7 deutschen Umlaute stehen. Zumeist stört diese Schwachstelle nicht.

Wer mag, darf diese Programmschwäche gerne korrigieren!

Codierung DOS oder Windows
(D oder W)
WDWDWDWDWDWDWD
Codierter deutscher Umlaut ä ä ö ö ü ü Ä Ä Ö Ö Ü Ü ß ß
Sucht hier bei D. Bei Übereinstimmung wird das Zeichen rechts daneben geliefertX0X1X2X3X4X5X6
Y0Y1Y2Y3Y4Y5Y6
Sucht hier bei W. Bei Übereinstimmung wird das Zeichen links daneben geliefertX0X1X2X3X4X5X6
Y0Y1Y2Y3Y4Y5Y6
Sucht hier bei HX0X1X2X3X4X5X6X7X8X9X10X11X12X13
Halbiert bei H die gefundene Stelle mit AbrundungZ0Z1Z2Z3Z4Z5Z6
und liefert die 6 Zeichen ab der 6-fachen Position.Y0Y6Y12Y18Y24Y30
Nur beim ß werden 7 Zeichen ab der 6-fachen Position geliefertY36
Aus dieser Zeichenkette werden die Zeichen bei H geliefert. Das erste Zeichen hat die Position 0.äöüÄÖUuml;ß
.MODEL TINY
comment #
======================================
Dies Filterprogramm wandelt deutsche Umlaute um.
Angeboten wird eine Umwandlung in beiden Richtungen zwischen DOS (ASCII) und Windows
und eine Umwandlung von DOS (ASCII) und Windos in benannte HTML-Zeichen (z.B. in
&Auml, &ouml, ß).
======================================
#

FALSE   EQU     0
TRUE    EQU     NOT FALSE

dump$   equ     true    ;fuer mdump,  rdump
prompt$ equ     false   ;fuer PROMPT, INKJN
intasc$ equ     false   ;fuer INT2ASC, ASC2INT
string$ equ     false   ;fuer CMPSTR, LENSTR, INSTR, MOVSTR


.CODE
        ORG     100h

Vers:   JMP     around
        include firm.mac

;Text, gleichzeitig Puffer
Text     DB     '0'
comment #
Umlauttabelle, enthält Windows- und MS-Dosumlaute äöüßÄÖÜ jeweils nebeneinander
zuerst Windows, dann MS-DOS
          ä  ö  ü  Ä  Ö  Ü  ß
Windows:  e4 f6 fc c4 d6 dc df
MS-DOS:   84 94 81 8e 99 9a e1
Die benannten HTML-Zeichen ergenen 6 Bytes lange Umschreibungen. Nur die
Umschreibung fuer sz ist 7 Bytes lang.
#

umlaute db 0e4h,84h,0f6h,94h,0fch,81h,0c4h,08eh,0d6h,99h,0dch,9ah,0dfh,0e1h
webuml  db "äöüÄÖÜß"

konv    db      0       ;Konvertierungsart D, W oder H

;-----
;Verzweigung aufgrund des eingetppten Parameters M, W oder H
;-----
btab    db      'DWH '  ;mgl.Parameter
lbtab   equ     $-btab
wohin   dw      hilfe           ;hilfeanzeige
        dw      lese            ;Codewandlung in html
        dw      lese            ;Codewandlung in Windowscode
        dw      lese            ;Codewandlung in DOS-Code

;-----
;hilfstextanzeige wenn aufruf ohne parameter
;-----
hilfe:
        call        prmsg
 dbl    'Usage: uml D|W|H'
 dbl    <'Codewandlung deutsche Umlaute ',84h,94h,81h,8eh,99h,9ah,0e1h,' von / in'>
 dbl   'Aufrufparameter'
 dbl   'D  Windowscode in DOS-Code (ASCII)'
 dbl   'W  DOS-Code (ASCII) in Windowscode'
 dbl   'H  DOS-Code (ASCII) und Windowscode in HTML Folgen (&...;)'
 dbl   'Das Programm uebertraegt von Standardeingabe in Standardausgabe.'
 dbl     "Bei Tastatureingabe: Ctrl Z bewirkt Programmende."
        db      0
        jmp     ret1

;-----
;Unterprogramm Codewandlung Umlaut von Windows- in DOS-Codierung (ASCII)
;Das zu untersuchende Zeichen steht in al
;-----
todos:  mov     cx,7            ;Tabelle Umlaute ist 14 Zeichen lang
        mov     bx, offset umlaute      ;zur Adressierung
todos1: cmp     b cs:[bx],al
        je      todos9
        inc     bx              ;adressieren naechsten Tabellenplatz
        inc     bx
        loop    todos1
        ret

todos9: inc     bx
        mov     al,[bx]
        mov     Text,al
        ret

;-----
;Unterprogramm Codewandlung Umlaut von DOS (ASCII)- in Windowscodierung
;Das zu untersuchende Zeichen steht in al
;-----
towin:  mov     cx,7            ;Tabelle umlaute ist 14 Zeichen lang
        mov     bx, offset umlaute+1    ;zur Adressierung
towin1: cmp     b cs:[bx],al
        je      towin9
        inc     bx              ;adressieren naechsten Tabellenplatz
        inc     bx
        loop    towin1
        ret

towin9: dec     bx
        mov     al,[bx]
        mov     Text,al
        ret

;-----
;Unterprogramm Codewandlung Umlaut von Windows- und DOS-Codierung (ASCII)
;in benanntes HTML-Zeichen
;-----
tohtml: mov     cx,14           ;Tabelle umlaute ist 14 Zeichen lang
        mov     bx, offset umlaute      ;zur Adressierung
tohtml1:
        cmp     b cs:[bx],al
        je      tohtml9
        inc     bx              ;adressieren naechsten Tabellenplatz
        loop    tohtml1
        mov     cx,1            ;Wenn kein Umlaut: Länge des Textes
        mov     dx,offset Text  ;Offsetadresse des Puffers
        ret

tohtml9:
        mov     dx,offset webuml        ;Offsetadresse des Puffers errechnen
        sub     bx, offset umlaute
        shr     bx,1            ;bx Division durch 2, Rest abschneiden
        add     bx,bx           ;bx*2
        add     dx,bx           ;dx+2*bx
        add     bx,bx           ;bx*4
        add     dx,bx           ;dx+6*bx
        mov     cx,6h           ;normalerweise 6 Bytes
        cmp     bx,24           ;auf ß ?
;       pusha
;       rdump
;       popa
        jne     tohtml10        ;nein. Es bleibt bei 6 Bytes
        inc     cx              ;wen ß dann 1 Byte mehr
tohtml10:
        ret

;-----
; Hauptprogramm, Parameterauswertung
;-----
around:
        cld
        mov     b cs:attr,Ma_normal
        mov     al,byte ptr cs:fcb+1

        mov     b cs:konv,al    ;Konvertierungsart

        lea     di,btab         ;befehlstabelle
        mov     cx,lbtab        ;deren laenge
        repne   scasb
        je      w1
        jmp     hilfe           ;ungueltiger aufrufparameter

w1:     add     cx,cx           ;*2->tabellenoffset
        mov     di,cx
        jmp     wohin[di]

;-----
; Hauptprogramm, Verarbeitungsschleife
; Hier erfolgt Programmfortsetzung bei gueltigem Aufrufparameter
;-----
lese:
        mov     bx,0            ;Handle console (eingabe)
        mov     cx,1            ;1 Zeichen lesen
        mov     dx,offset Text
        mov     ah,3fh          ;lesen
        int     21h
        or      ah,al           ;ax ist 0 wenn EOF
        jz      fertig

        mov     al,Text ;gelesenes Zeichen nach AL

        mov     al,text
        cmp     al,01ah         ;ctrl z bewirkt Programmende

        je      fertig

        cmp     konv,"D"        ;abfragen Konvertierungsart
        jne     obW
        call    todos
        jmps    schreibe1       ;schreibe 1 Zeichen

obW:    cmp     konv,"W"
        jne     istH

        call    towin
        jmps    schreibe1       ;schreibe 1 Zeichen

istH:
        call    tohtml          ;dies Unterprogrtamm bereitet cx und dx auf
        jmps    schreibex       ;schreibe 1, 5 oder 6 Zeichen

schreibe1:
        mov     cx,1            ;Länge des Textes
        mov     dx,offset Text  ;Offsetadresse des Puffers
schreibex:
        mov     bx,1            ;Handle console (ausgabe)
        mov     ah,40h          ;schreiben
        int     21h
        jmp     lese

fertig:
        MOV     AX,4C00h        ;EXIT
        INT     21h
        END     Vers
Letztes Upload: 24.03.2023 um 11:35:11 • Impressum und Datenschutzerklärung