.MODEL SMALL
.STACK 100H
.DATA
PROMPT_1 DB 0DH,0AH,'STRING_1 : $'
PROMPT_2 DB 0DH,0AH,'STRING_2 : $'
BEFORE DB ' * * * * * Before Copying * * * * *$'
AFTER DB 0DH,0AH,0AH,' * * * * * After Copying * * * * *$'
STRING_1 DB ' Please visit : http://www.mts-home.cjb.net '
STRING_2 DB 45 DUP(?)
.CODE
MAIN PROC
MOV AX, @DATA ; initialize DS and ES
MOV DS, AX
MOV ES, AX
MOV BX, 45 ; set BX=45
MOV AH, 9 ; set string output function
LEA DX, BEFORE ; load and print the string BEFORE
INT 21H
LEA DX, PROMPT_1 ; load and print the string PROMPT_1
INT 21H
LEA SI, STRING_1 ; set SI=offset address of variable STRING_1
CALL DISP_STR ; call the procedure DISP_STR
LEA DX, PROMPT_2 ; load and print the string PROMPT_2
INT 21H
LEA SI, STRING_2 ; set SI=offset address of variable STRING_2
CALL DISP_STR ; call the procedure DISP_STR
LEA SI, STRING_1 ; set SI=offset address of variable STRING_1
LEA DI, STRING_2 ; set DI=offset address of variable STRING_2
CALL COPY_STR ; call the procedure COPY_STR
LEA DX, AFTER ; load and print the string AFTER
INT 21H
LEA DX, PROMPT_1 ; load and print the string PROMPT_1
INT 21H
LEA SI, STRING_1 ; set SI=offset address of variable STRING_1
CALL DISP_STR ; call the procedure DISP_STR
LEA DX, PROMPT_2 ; load and print the string PROMPT_2
INT 21H
LEA SI, STRING_2 ; set SI=offset address of variable STRING_2
CALL DISP_STR ; call the procedure DISP_STR
MOV AH, 4CH ; return control to DOS
INT 21H
MAIN ENDP
;**************************************************************************;
;**************************************************************************;
;------------------------- Procedure Definitions ------------------------;
;**************************************************************************;
;**************************************************************************;
;**************************************************************************;
;------------------------------- COPY_STR -------------------------------;
;**************************************************************************;
COPY_STR PROC
; this procedure will copy the string2 into string1
; input : SI=offset address of the string1
; : DI=offset address of the string2
; : BX=number of characters in the string
; output : SI=offset address of the string1
; : DI=offset address of the string2
PUSH CX ; push CX onto the STACK
PUSH SI ; push SI onto the STACK
PUSH DI ; push DI onto the STACK
CLD ; clear direction flag
MOV CX, BX ; set CX=BX
REP MOVSB ; set ES:[DI]=DS:[SI]
POP DI ; pop a value from STACK into DI
POP SI ; pop a value from STACK into SI
POP CX ; pop a value from STACK into CX
RET
COPY_STR ENDP
;**************************************************************************;
;------------------------------- DISP_STR -------------------------------;
;**************************************************************************;
DISP_STR PROC
; this procedure will display the given string
; input : SI=offset address of the string
; : BX=number of characters in the string
; output : none
PUSH AX ; push AX onto the STACK
PUSH BX ; push BX onto the STACK
PUSH CX ; push CX onto the STACK
PUSH DX ; push DX onto the STACK
PUSH SI ; push SI onto the STACK
CLD ; clear direction flag
MOV CX, BX ; set CX=BX
MOV AH, 2 ; set output function
JCXZ @SKIP_OUTPUT ; jump to label @SKIP_OUTPUT if CX=0
@OUTPUT_LOOP: ; loop label
LODSB ; set AL=DS:[SI]
MOV DL, AL ; set DL=AL
INT 21H ; print a character
LOOP @OUTPUT_LOOP ; jump to label @OUTPUT_LOOP while CX!=0
@SKIP_OUTPUT: ; jump label
POP SI ; pop a value from STACK into SI
POP DX ; pop a value from STACK into DX
POP CX ; pop a value from STACK into CX
POP BX ; pop a value from STACK into BX
POP AX ; pop a value from STACK into AX
RET
DISP_STR ENDP
;**************************************************************************;
;--------------------------------------------------------------------------;
;**************************************************************************;
END MAIN