Mit „D”, „W” und „H” ist der beim Programmaufruf mitgegebene Parameter D, W oder H gemeint. Er bestimmt die Art der Umcodierung.
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!
.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 Ä, ö, ß). ====================================== # 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 |