home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Programm, um zu zeigen, wie man mehrere Code- und Datensegmente
- ; in einem Programm verwalten kann.
- ;
- ; Liest einen String, speichert ihn dann in einem Datensegment,
- ; kopiert ihn dann in ein anderes Datensegment, wobei Großbuch-
- ; staben in Kleinbuchstaben umgewandelt werden. Anschließend wird
- ; der String wieder auf der Konsole ausgegeben.
- ; Zum Lesen, Ausgeben und Kopieren des Strings werden Funktionen
- ; in anderen Segmenten aufgerufen.
- ;
- StackSeg SEGMENT PARA STACK 'STACK'
- DB 512 DUP (?)
- StackSeg ENDS
-
- MAX_STRING EQU 1000
-
- QuellDatenSeg SEGMENT PARA PRIVATE 'DATA'
- EingabePuffer DB MAX_STRING DUP (?)
- QuellDatenSeg ENDS
-
- ZielDatenSeg SEGMENT PARA PRIVATE 'DATA'
- AusgabePuffer DB MAX_STRING DUP (?)
- ZielDatenSeg ENDS
-
- UPSeg SEGMENT PARA PRIVATE 'CODE'
- ASSUME cs:UPSeg
- ; Unterprogramm zum Einlesen eines Strings von der Konsole. Das Ende
- ; des Strings wird mit dem Zeichen CR gekennzeichnet, das anschließend
- ; in ein CR/LF-Paar umgewandelt wird, damit bei der Ausgabe unter MS-DOS
- ; ein Zeilenvorschub ausgeführt wird. Der String wird mit NUL abgeschlos-
- ; sen.
- ;
- ; Eingabewerte:
- ; ES:DI - Zeiger auf Speicherbereich, in den der String
- ; kopiert werden soll.
- ;
- ; Ausgabewerte: Keine
- ;
- ; Veränderte Register: AX, DI
- ;
- StringLesen PROC FAR
- StringLesenSchleife:
- mov ah,1
- int 21h ; nächstes Zeichen lesen
- stosb ; speichern
- cmp al,13 ; CR ?
- jnz StringLesenSchleife
- mov BYTE PTR es:[di],10 ; String mit LF
- mov BYTE PTR es:[di+1],0 ; und NUL abschließen
- ret
- StringLesen ENDP
- ;
- ; Unterprogramm zum Kopieren eines Strings, der dabei in
- ; Kleinbuchstaben umgewandelt wird
- ;
- ; Eingabewerte:
- ; DS:SI - String, der kopiert wird
- ; ES:DI - Stelle, wohin der String kopiert wird
- ;
- ; Ausgabewerte: Keine
- ;
- ; Veränderte Register: AL, SI, DI
- ;
- KopieInKleinbuchstaben PROC FAR
- KopierSchleife:
- lodsb
- cmp al,'A'
- jb KeinGrossbuchstabe
- cmp al,'Z'
- ja KeinGrossbuchstabe
- add al,20h ; in Kleinbuchstaben umwandeln
- KeinGrossBuchstabe:
- stosb
- and al,al ; NUL am Ende ?
- jnz KopierSchleife ; Nein, nächstes Zeichen
- ret
- KopieInKleinbuchstaben ENDP
- ;
- ; Unterprogramm für die Ausgabe eines Strings
- ;
- ; Eingabewerte:
- ; DS:SI - Zeiger auf String, er ausgegeben werden soll
- ;
- ; Ausgabewerte: Keine
- ;
- ; Veränderte Register: AH, DL, SI
- ;
- StringAusgabe PROC FAR
- StringAusgabeSchleife:
- mov dl,[si] ; Zeichen holen
- and dl,dl ; NUL-Zeichen ?
- jz StringAusgabeFertig ; ja, fertig
- inc si ; Zeiger auf das nächste Zeichen
- mov ah,2
- int 21h ; Zeichen ausgeben
- jmp StringAusgabeSchleife
- StringAusgabeFertig:
- ret
- StringAusgabe ENDP
- UPSeg ENDS
-
- Code SEGMENT PARA PRIVATE 'CODE'
- ASSUME cs:Code,ds:NOTHING,es:NOTHING,SS:StackSeg
- ProgrammAnfang:
- cld ; Stringzeiger werden inkrementiert
- ;
- ; String von der Konsole in Eingabepuffer lesen
- ;
- mov ax,QuellDatenSeg
- mov es,ax
- ASSUME es:QuellDatenSeg
- mov di,OFFSET EingabePuffer
- call StringLesen ; String von Konsole lesen und unter
- ; ES:DI speichern
- ;
- ; Zeilenvorschub in die nächste Zeile
- ;
- mov ah,2
- mov dl,10
- int 21h
- ;
- ; String vom EingabePuffer auf den AusgabePuffer kopieren
- ; Gleichzeitig Umwandlung in Kleinbuchstaben
- ;
- push es
- pop ds
- ASSUME ds:QuellDatenSeg
- mov ax,ZielDatenSeg
- mov es,ax
- ASSUME es:ZielDatenSeg
- mov si,OFFSET EingabePuffer ; Kopie von DS:SI
- mov di,OFFSET AusgabePuffer ; nach ES:DI und
- call KopieInKleinbuchstaben ; in Kleinbuchstaben umwandeln
- ;
- ; String in Kleinbuchstaben ausgeben
- ;
- push es
- pop ds
- ASSUME ds:ZielDatenSeg
- mov si,OFFSET AusgabePuffer
- call StringAusgabe ; String in DS:SI ausgeben
- ;
- ; Fertig.
- ;
- mov ah,4Ch
- int 21h
- Code ENDS
- END ProgrammAnfang
-