Moin.
Solche Windows-Fragen gehören eigentlich gar nicht in dieses DOS-Forum.
Allerdings hatte ich ein ähnliches Problem mit den unterschiedlichhen Zeilenumbrüchen in Textdateien, wo einmal 0Dh+0Ah und ein anderes Mal nur ein 0Ah benötigt wird. Dafür habe ich zwei kleine DOS-Programme geschrieben, wo das eine Programm alle 0Dh aus einer Textdatei entfernt und das andere Programm jeweils ein 0Dh bei allen dort vorhandenen 0Ahs mit einfügt.
Auf ähnliche Weise könnte man auch bestimmte Zeichen durch andere Zeichen ersetzen lassen, wenn man das Programm dafür entsprechend modifiziert.
Code: Alles auswählen
;╔════════════════════════════════════════════════════════════════════════════╗
;║ ║
;║ Dieses Programm entfernt alle Carrige Return(0Dh) aus einer Datei, ║
;║ dessen Name als Parameter, mit übergeben wird. ║
;║ Die Datei muß kleiner als 64KB groß sein. ║
;║ ║
;║ #!/bin/sh ║
;║ for i in `find -type f`; do tr -d '\r' <$i >/tmp/trtmp && mv /tmp/trtmp ║
;║ ║
;║ (C) Copyright: Freie Cracker Crew Hamburg Horn ║
;║ von: Dirk Wolfgang Glomp ║
;║ ║
;╚════════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL ; Programm möglichst klein halten
.386
;────────────────────────────────────────────────────────────────────────────
CODE SEGMENT use16 'CODE'
assume cs:CODE,ds:DATEN,ss:STAPEL
org 100h
;────────────────────────────────────────────────────────────────────────────
START: mov ax, DATEN
mov ds, ax
mov bx, ss ; zunächst die beiden Segmentadressen
mov ax, es ; voneinander abziehen. Das ergibt die
sub bx, ax ; Anzahl der Paragraphen vom PSP bis
; zum Anfang des Stack
mov ax, sp ; da sich der Stackpointer am Ende des
add ax, 0Fh ; Stacksegments befindet, gibt sein
shr ax, 4 ; Inhalt die Länge des Stacks an
add bx, ax ; zur bisherigen Länge hinzuaddieren
mov ah, 4Ah ; neue Größe an das DOS übergeben
int 21h
mov bx, 1000h ; 64 KB anfordern/reservieren
mov ah, 48h ; anfordern/reservieren: BX = Anzahl/16
int 21h
jc NOSPACE ; keine 64 KB = Fehler !
mov FILSEG, ax ; Segment des File's
mov fs, ax
;----------------------------------------------------------------------------
mov ah, 62h ; Segment des PSP's ermitteln
int 21h
mov ds, bx ; PSP-Segment nach DS
mov es, bx
mov di, 80h ; Länge Kommandozeile
mov cl, [di] ; nach CL
cmp cl, 2
jna NOPARA
cld ; aufwärts zählen
inc di
mov al, 20h
repe scasb ; erste Leerzeichen überspringen
dec di ; ein zurück
mov bp, di
SUCHCR: cmp BYTE PTR[di], 0Dh
jz short FOUND
inc di
jmp SUCHCR
;------------------------------------
FOUND: mov WORD PTR[di], 2400h ; hinter filenamen: 0,"$"
mov ax, fs
mov cx, es
mov fs, cx
mov es, ax
;----------------------------------------------------------------------------
mov dx, bp ; Zeiger auf 1.ASCII
mov ax, 3D02h ; Datei öffnen: lesen/schreiben (OPEN)
int 21h
jc NOFILE ; File nicht gefunden = Fehler !
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx ; low auf Anfang stellen
xor cx, cx ; high auf Anfang stellen
mov ax, 4202h ; Länge holen: vom Ende (LSEEK)
int 21h
and dx, dx ; High-word = null ?
jnz TOBIG ; nein zurück
mov FILEN, ax ; Anzahl retten
mov dx, 1 ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h ; nochmal wegen DOS-Fehler
xor dx, dx ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h
mov cx, FILEN ; Anzahl zu ladender Byte's
mov ds, FILSEG
mov ah, 3Fh ; Datei lesen u. Zeiger bewegen (READ)
int 21h
mov cx, ax ; Anzahl tatsächlich geladener Bytes retten
mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
;----------------------------------------------------------------------------
mov ax, DATEN
mov ds, ax
xor si, si
mov FILEN, cx
SUCHE: cmp si, cx ; Ende des File erreicht ?
ja short ZMA
cmp WORD PTR es:[si], 0A0Dh
jz short TEHR
cmp BYTE PTR es:[si], 0Ah
jz short FSGE
inc si
jmp short SUCHE
;------------------------------------
FSGE: inc WORD PTR[FILEN]
mov di, si
mov si, cx
sub cx, di
DGDA: mov al, es:[si]
mov es:[si+1], al
dec si
dec cx
jnz DGDA
mov cx, FILEN
mov si, di
mov WORD PTR es:[di], 0A0Dh
;------------------------------------
TEHR: add si, 2
jmp short SUCHE
;----------------------------------------------------------------------------
ZMA: mov ax, fs
mov dx, 82h
xor cx, cx
mov ds, ax
mov ah, 3Ch ; Datei erstellen
int 21h
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx
mov cx, FILEN
mov ds, FILSEG
mov ah, 40h ; Datei beschreiben (WRITE)
int 21h
;----------------------------------------------------------------------------
NBACK: mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
BACKE: mov ax, 4C00h ; Beendigungs-Code laden
int 21h ; Programm beenden, ... DOS !!!
;────────────────────────────────────────────────────────────────────────────
NOSPACE: mov dx, OFFSET ERRTEXT
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOPARA: mov ax, DATEN
mov ds, ax
mov dx, OFFSET PARERR
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOFILE: mov ax, DATEN
mov ds, ax
mov dx, OFFSET FILERR
mov ah, 9
int 21h
mov ax, fs
mov ds, ax
mov dx, bp
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
TOBIG: mov dx, OFFSET BIGERR
mov ah, 9
int 21h
jmp short NBACK
;----------------------------------------------------------------------------
CODE ends
;────────────────────────────────────────────────────────────────────────────
DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
FILSEG DW 0FFFFh ; Segment des File`s
FILEN DW 0FFFFh ; Anzahl der geladenen Byte`s
FILERR DB 0Dh, 0Ah
DB "FEHLER ! File auf (angegebenen) Laufwerk/Pfad nicht gefunden = $"
PARERR DB 0Dh, 0Ah
DB "FEHLER ! Kein Filename als Parameter angehängt/übergeben !$"
ERRTEXT DB 0Dh, 0Ah
DB "FEHLER ! Zu wenig Arbeits-Speicher vorhanden !"
DB 0Dh, 0Ah, 0Dh, 0Ah
DB "Das Programm benötigt zur Ausführung, ca. 64 KB freien Arbeits-Speicher !"
DB "$"
BIGERR DB 0Dh, 0Ah
DB "FEHLER ! File ist größer als 64KB !$"
;---------------------------------------------------------------------------
DATEN ends
;────────────────────────────────────────────────────────────────────────────
STAPEL SEGMENT use16 STACK 'STACK'
DB 20h dup (0FFh)
STAPEL ends
;────────────────────────────────────────────────────────────────────────────
end
Code: Alles auswählen
;╔════════════════════════════════════════════════════════════════════════════╗
;║ ║
;║ Dieses Programm fügt Carrige Returns(0Dh) in eine Datei mit ein, ║
;║ dessen Name als Parameter, mit übergeben wird. ║
;║ Die Datei muß kleiner als 64KB groß sein. ║
;║ ║
;║ (C) Copyright: Freie Cracker Crew Hamburg Horn ║
;║ von: Dirk Wolfgang Glomp ║
;║ ║
;╚════════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL ; Programm möglichst klein halten
.386
;────────────────────────────────────────────────────────────────────────────
CODE SEGMENT use16 'CODE'
assume cs:CODE,ds:DATEN,ss:STAPEL
org 100h
;────────────────────────────────────────────────────────────────────────────
START: mov ax, DATEN
mov ds, ax
mov bx, ss ; zunächst die beiden Segmentadressen
mov ax, es ; voneinander abziehen. Das ergibt die
sub bx, ax ; Anzahl der Paragraphen vom PSP bis
; zum Anfang des Stack
mov ax, sp ; da sich der Stackpointer am Ende des
add ax, 0Fh ; Stacksegments befindet, gibt sein
shr ax, 4 ; Inhalt die Länge des Stacks an
add bx, ax ; zur bisherigen Länge hinzuaddieren
mov ah, 4Ah ; neue Größe an das DOS übergeben
int 21h
mov bx, 1000h ; 64 KB anfordern/reservieren
mov ah, 48h ; anfordern/reservieren: BX = Anzahl/16
int 21h
jc NOSPACE ; keine 64 KB = Fehler !
mov FILSEG, ax ; Segment des File's
mov fs, ax
;----------------------------------------------------------------------------
mov ah, 62h ; Segment des PSP's ermitteln
int 21h
mov ds, bx ; PSP-Segment nach DS
mov es, bx
mov di, 80h ; Länge Kommandozeile
mov cl, [di] ; nach CL
cmp cl, 2
jna NOPARA
cld ; aufwärts zählen
inc di
mov al, 20h
repe scasb ; erste Leerzeichen überspringen
dec di ; ein zurück
mov bp, di
SUCHCR: cmp BYTE PTR[di], 0Dh
jz short FOUND
inc di
jmp SUCHCR
;------------------------------------
FOUND: mov WORD PTR[di], 2400h ; hinter filenamen: 0,"$"
mov ax, fs
mov cx, es
mov fs, cx
mov es, ax
;----------------------------------------------------------------------------
mov dx, bp ; Zeiger auf 1.ASCII
mov ax, 3D02h ; Datei öffnen: lesen/schreiben (OPEN)
int 21h
jc NOFILE ; File nicht gefunden = Fehler !
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx ; low auf Anfang stellen
xor cx, cx ; high auf Anfang stellen
mov ax, 4202h ; Länge holen: vom Ende (LSEEK)
int 21h
and dx, dx ; High-word = null ?
jnz TOBIG ; nein zurück
mov FILEN, ax ; Anzahl retten
mov dx, 1 ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h ; nochmal wegen DOS-Fehler
xor dx, dx ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h
mov cx, FILEN ; Anzahl zu ladender Byte's
mov ds, FILSEG
mov ah, 3Fh ; Datei lesen u. Zeiger bewegen (READ)
int 21h
mov cx, ax ; Anzahl tatsächlich geladener Bytes retten
mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
;----------------------------------------------------------------------------
mov ax, DATEN
mov ds, ax
xor si, si
mov FILEN, cx
SUCHE: cmp si, cx ; Ende des File erreicht ?
ja short ZMA
cmp WORD PTR es:[si], 0A0Dh
jz short TEHR
cmp BYTE PTR es:[si], 0Ah
jz short FSGE
inc si
jmp short SUCHE
;------------------------------------
FSGE: inc WORD PTR[FILEN]
mov di, si
mov si, cx
sub cx, di
DGDA: mov al, es:[si]
mov es:[si+1], al
dec si
dec cx
jnz DGDA
mov cx, FILEN
mov si, di
mov WORD PTR es:[di], 0A0Dh
;------------------------------------
TEHR: add si, 2
jmp short SUCHE
;----------------------------------------------------------------------------
ZMA: mov ax, fs
mov dx, 82h
xor cx, cx
mov ds, ax
mov ah, 3Ch ; Datei erstellen
int 21h
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx
mov cx, FILEN
mov ds, FILSEG
mov ah, 40h ; Datei beschreiben (WRITE)
int 21h
;----------------------------------------------------------------------------
NBACK: mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
BACKE: mov ax, 4C00h ; Beendigungs-Code laden
int 21h ; Programm beenden, ... DOS !!!
;────────────────────────────────────────────────────────────────────────────
NOSPACE: mov dx, OFFSET ERRTEXT
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOPARA: mov ax, DATEN
mov ds, ax
mov dx, OFFSET PARERR
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOFILE: mov ax, DATEN
mov ds, ax
mov dx, OFFSET FILERR
mov ah, 9
int 21h
mov ax, fs
mov ds, ax
mov dx, bp
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
TOBIG: mov dx, OFFSET BIGERR
mov ah, 9
int 21h
jmp short NBACK
;----------------------------------------------------------------------------
CODE ends
;────────────────────────────────────────────────────────────────────────────
DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
FILSEG DW 0FFFFh ; Segment des File`s
FILEN DW 0FFFFh ; Anzahl der geladenen Byte`s
FILERR DB 0Dh, 0Ah
DB "FEHLER ! File auf (angegebenen) Laufwerk/Pfad nicht gefunden = $"
PARERR DB 0Dh, 0Ah
DB "FEHLER ! Kein Filename als Parameter angehängt/übergeben !$"
ERRTEXT DB 0Dh, 0Ah
DB "FEHLER ! Zu wenig Arbeits-Speicher vorhanden !"
DB 0Dh, 0Ah, 0Dh, 0Ah
DB "Das Programm benötigt zur Ausführung, ca. 64 KB freien Arbeits-Speicher !"
DB "$"
BIGERR DB 0Dh, 0Ah
DB "FEHLER ! File ist größer als 64KB !$"
;---------------------------------------------------------------------------
DATEN ends
;────────────────────────────────────────────────────────────────────────────
STAPEL SEGMENT use16 STACK 'STACK'
DB 20h dup (0FFh)
STAPEL ends
;────────────────────────────────────────────────────────────────────────────
end
Dirk