Home |
8086 Assembler,
|
Zurück zur Assemblerauswahlseite |
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 dem 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 Winddows- 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
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||