home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Programm zum Zählen der Worte in einer Datei. Die Worte
- ; sind mit einem Leerzeichen, einem Tabulator, CR oder LF
- ; voneinander getrennt.
- ;
- ; Verwendung: wcount < Datei.ext
- ; Anmerkung: Datei muß mit Control-Z abgeschlossen sein
- ;
- DOSSEG
- .MODEL SMALL
- .STACK 200h
- .DATA
- Zaehler DW 0 ; Zählt die Worte
- LeerzeichenFlag DB ? ; auf 1 gesetzt, wenn das letzte
- ; Zeichen ein Leerzeichen war
- TempZeichen DB ? ; Zwischenspeichern für Zeichen
- Ergebnis DB 'Worte zählen: ', 5 DUP (?)
- ; String für die Ausgabe
- ; Label für das Stringende
- ZaehlerEinfuegenEnde LABEL BYTE
- DB 0Dh,0Ah,'$'
-
- .CODE
- ProgrammAnfang:
- mov ax,@Data
- mov ds,ax ; DS zeigt auf Datensegment
- mov [LeerzeichenFlag],1 ; Leerzeichen annehmen
- ZaehlSchleife:
- call NaechstesZeichenHolen
- jz EndeZaehlen ; Falls Ende erreicht
- call IstEsEinLeerzeichen ; Nach Leerzeichen suchen
- jz IstLeerzeichen ; Ja
- cmp [LeerzeichenFlag],0 ; Kein Leerzeichen
- jz ZaehlSchleife ; Normales Zeichen in Wort
- inc [Zaehler] ; Neues Wort gefunden
- mov [LeerzeichenFlag],0 ; Kein Leerzeichen
- jmp ZaehlSchleife ; Nächstes Zeichen
- IstLeerzeichen:
- mov [LeerzeichenFlag],1 ; Leerzeichen vorgeben
- jmp ZaehlSchleife ; Nächstes Zeichen
- EndeZaehlen:
- mov ax,[Zaehler] ; Zahl, die umgewandelt wird
- mov bx,OFFSET ZaehlerEinfuegenEnde - 1
- ; Zeiger auf Stringende für Zahl
- mov cx,5 ; Anzahl der Ziffern
- call ZahlInStringUmwandeln ; Zahl umwandeln
- mov bx,OFFSET Ergebnis ; Zeiger auf String mit Ergebnis
- call StringAusgabe ; String ausgeben
- mov ah,4Ch ; DOS-Funktion Programmende
- int 21h ; Programm beenden
- ;
- ; Unterprogramm zum Lesen des nächsten Zeichens vom
- ; Standardeingabegerät
- ;
- ; Eingabewerte: Keine
- ;
- ; Ausgabewerte:
- ; AL = Zeichen, falls vorhanden
- ; Zero-Flag = 0 (NZ) wenn ein Zeichen vorhanden ist
- ; = 1 (Z) wenn das Dateiende erreicht ist
- ;
- NaechstesZeichenHolen PROC
- mov ah,3Fh ; DOS-Funktion Datei lesen
- mov bx,0 ; Standardeingabegerät
- mov cx,1 ; Ein Zeichen
- mov dx,OFFSET TempZeichen ; Einlesen in TempZeichen
- int 21h ; Zeichen lesen
- jc KeinZeichenGelesen ; Falls Fehler dann Dateiende
- cmp [TempZeichen],1Ah ; Ctrl-Z abfragen
- jne KeinControlZ ; Nein
- KeinZeichenGelesen:
- sub ax,ax ; Keines gelesen
- and ax,ax ; Zero-Flag setzen
- KeinControlZ:
- mov al,[TempZeichen] ; Zeichen zurückgeben
- ret
- NaechstesZeichenHolen ENDP
- ;
- ; Unterprogramm zum Prüfen, ob ein Leerzeichen vorliegt
- ;
- ; Eingabewerte:
- ; AL = Zeichen, das überprüft wird
- ;
- ; Ausgabewerte:
- ; Zero-Flag = 0 falls kein Leerzeichen
- ; = 1 falls Leerzeichen
- ;
- ; Veränderte Register: keine
- ;
- IstEsEinLeerzeichen PROC
- cmp al,' ' ; Leerzeichen?
- jz EndeLeerzeichenPruefung
- cmp al,09h ; TAB?
- jz EndeLeerzeichenPruefung
- cmp al,0Dh ; CR?
- jz EndeLeerzeichenPruefung
- cmp al,0Ah ; LF?
- EndeLeerZeichenPruefung:
- ret
- IstEsEinLeerZeichen ENDP
- ;
- ; Unterprogramm zum Umwandeln einer Binär-zahl in einen String
- ;
- ; Eingabewerte:
- ; AX = Zahl, die umgewandelt werden soll
- ; DS:BX = Zeiger auf Bereich zum Speichern des Strings
- ; CX = Anzahl der Zeichen
- ;
- ; Ausgabewerte: keine
- ;
- ; Veränderte Register: AX, BX, CX, DX, SI
- ;
- ZahlInStringUmwandeln PROC
- mov si,10 ; Teiler durch 10
- Umwandeln:
- sub dx,dx ; oberes Wort löschen
- div si ; Dividieren
- add dl,'0' ; Rest in ASCII-Ziffer umwandeln
- mov [bx],dl ; speichern
- dec bx ; Zeiger auf nächste Ziffer
- loop Umwandeln
- ret
- ZahlInStringUmwandeln ENDP
- ;
- ; Unterprogramm für die Ausgabe eines Strings
- ;
- ; Eingabewerte:
- ; DS:BX = Zeiger auf String, der ausgegeben werden soll
- ;
- ; Ausgabewerte: keine
- ;
- ; Veränderte Register: keine
- ;
- StringAusgabe PROC
- push ax ; AX-Register retten
- push dx ; DX-Register retten
- mov ah,9 ; DOS-Funktion Stringausgabe
- mov dx,bx ; Zeiger auf String in DX
- int 21h ; String ausgeben
- pop dx ; DX-Register wiederherstellen
- pop ax ; AX-Register wiederherstellen
- ret
- StringAusgabe ENDP
- END ProgrammAnfang