home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Jason Aller Floppy Collection
/
123.img
/
TASM.ZIP
/
MULT_C&D.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-10-31
|
4KB
|
148 lines
;
; Program to demonstrate use of multiple code and data segments.
;
; Reads a string from the console, stores it in one data
; segment, copies the string to another data segment, converting
; it to lowercase in the process, then prints the string to the
; console. Uses functions in another code segment to read,
; print, and copy the string.
;
StackSeg SEGMENT PARA STACK 'STACK'
DB 512 DUP (?)
StackSeg ENDS
MAX_STRING_LENGTH EQU 1000
SourceDataSeg SEGMENT PARA PRIVATE 'DATA'
InputBuffer DB MAX_STRING_LENGTH DUP (?)
SourceDataSeg ENDS
DestDataSeg SEGMENT PARA PRIVATE 'DATA'
OutputBuffer DB MAX_STRING_LENGTH DUP (?)
DestDataSeg ENDS
SubCode SEGMENT PARA PRIVATE 'CODE'
ASSUME CS:SubCode
;
; Subroutine to read a string from the console. String end is
; marked by a carriage-return, which is converted to a
; carriage-return/linefeed pair so it will advance to the next
; line when printed. A 0 is added to terminate the string.
;
; Input:
; ES:DI - location to store string at
;
; Output: None
;
; Registers destroyed: AX,DI
;
GetString PROC FAR
GetStringLoop:
mov ah,1
int 21h ;get the next character
stosb ;save it
cmp al,13 ;is it a carriage-return?
jnz GetStringLoop ;no-not done yet
mov BYTE PTR es:[di],10
mov BYTE PTR es:[di+1],0 ;end the string with a linefeed
; and a 0
ret
GetString ENDP
;
; Subroutine to copy a string, converting it to lowercase.
;
; Input:
; DS:SI - string to copy
; ES:DI - place to put string
;
; Output: None
;
; Registers destroyed: AL, SI, DI
;
CopyLowercase PROC FAR
CopyLoop:
lodsb
cmp al,'A'
jb NotUpper
cmp al,'Z'
ja NotUpper
add al,20h ;convert to lowercase if it's uppercase
NotUpper:
stosb
and al,al ;was that the 0 that ends the string?
jnz CopyLoop ;no, copy another character
ret
CopyLowercase ENDP
;
; Subroutine to display a string to the console.
;
; Input:
; DS:SI - string to display
;
; Output: None
;
; Registers destroyed: AH,DL,SI
;
DisplayString PROC FAR
DisplayStringLoop:
mov dl,[si] ;get the next character
and dl,dl ;is this the 0 that ends the string?
jz DisplayStringDone ;yes, we're done
inc si ;point to the following character
mov ah,2
int 21h ;display the character
jmp DisplayStringLoop
DisplayStringDone:
ret
DisplayString ENDP
SubCode ENDS
Code SEGMENT PARA PRIVATE 'CODE'
ASSUME CS:Code,DS:NOTHING,ES:NOTHING,SS:StackSeg
ProgramStart:
cld ;make string instructions increment
; their pointer registers
;
; Read a string from the console into InputBuffer.
;
mov ax,SourceDataSeg
mov es,ax
ASSUME ES:SourceDataSeg
mov di,OFFSET InputBuffer
call GetString ;read string from the console and
; store it at ES:DI
;
; Print a linefeed to advance to the next line.
;
mov ah,2
mov dl,10
int 21h
;
; Copy the string from InputBuffer to OutputBuffer, converting
; it to lowercase in the process.
;
push es
pop ds
ASSUME DS:SourceDataSeg
mov ax,DestDataSeg
mov es,ax
ASSUME ES:DestDataSeg
mov si,OFFSET InputBuffer ;copy from DS:SI...
mov di,OFFSET OutputBuffer ;...to ES:DI...
call CopyLowercase ;...making it lowercase
;
; Display the lowercase string.
;
push es
pop ds
ASSUME DS:DestDataSeg
mov si,OFFSET OutputBuffer
call DisplayString ;display string at DS:SI to the console
;
; Done.
;
mov ah,4ch
int 21h
Code ENDS
END ProgramStart