.MODEL SMALL
.STACK 100H
.DATA
PROMPT_1 DB 'The contents of the array before reversing : $'
PROMPT_2 DB 0DH,0AH,'The contents of the array after reversing : $'
ARRAY DW 0,1,2,3,4,5,6,7,8,9
.CODE
MAIN PROC
MOV AX, @DATA ; initialize DS
MOV DS, AX
MOV BX, 10 ; set BX=10
LEA DX, PROMPT_1 ; load and display the string PROMPT_1
MOV AH, 9
INT 21H
LEA SI, ARRAY ; set SI=offset address of ARRAY
CALL PRINT_ARRAY ; call the procedure PRINT_ARRAY
LEA SI, ARRAY ; set SI=offset address of ARRAY
CALL REVERSE_ARRAY ; call the procedure REVERSE_ARRAY
LEA DX, PROMPT_2 ; load and display the string PROMPT_2
MOV AH, 9
INT 21H
LEA SI, ARRAY ; set SI=Address of ARRAY
CALL PRINT_ARRAY ; call the procedure PRINT_ARRAY
MOV AH, 4CH ; return control to DOS
INT 21H
MAIN ENDP
;**************************************************************************;
;**************************************************************************;
;------------------------- Procedure Definitions ------------------------;
;**************************************************************************;
;**************************************************************************;
;**************************************************************************;
;----------------------------- PRINT_ARRAY ------------------------------;
;**************************************************************************;
PRINT_ARRAY PROC
; this procedure will print the elements of a given array
; input : SI=offset address of the array
; : BX=size of the array
; output : none
PUSH AX ; push AX onto the STACK
PUSH CX ; push CX onto the STACK
PUSH DX ; push DX onto the STACK
MOV CX, BX ; set CX=BX
@PRINT_ARRAY: ; loop label
MOV AX, [SI] ; set AX=AX+[SI]
CALL OUTDEC ; call the procedure OUTDEC
MOV AH, 2 ; set output function
MOV DL, 20H ; set DL=20H
INT 21H ; print a character
ADD SI, 2 ; set SI=SI+2
LOOP @PRINT_ARRAY ; jump to label @PRINT_ARRAY while CX!=0
POP DX ; pop a value from STACK into DX
POP CX ; pop a value from STACK into CX
POP AX ; pop a value from STACK into AX
RET ; return control to the calling procedure
PRINT_ARRAY ENDP
;**************************************************************************;
;--------------------------- REVERSE_ARRAY ------------------------------;
;**************************************************************************;
REVERSE_ARRAY PROC
; this procedure will reverse the contents of the given array
; input : SI=offset address of the array
; : BX=size of the array
; output : none
PUSH AX ; push AX onto the STACK
PUSH BX ; push BX onto the STACK
PUSH CX ; push CX onto the STACK
PUSH DI ; push DI onto the STACK
MOV DX, SI ; set DX=SI
MOV CX, BX ; set CX=BX
DEC BX ; set BX=BX-1
SHL BX, 1 ; set BX=BX*2
MOV DI, SI ; set DI=SI
ADD DI, BX ; set DI=DI+BX
SHR CX, 1 ; set CX=CX/2
@REPEAT: ; loop label
MOV AX, [SI] ; set AX=[SI]
XCHG AX, [DI] ; set AX=[DI], [DI]=AX
MOV [SI], AX ; set [SI]=AX
ADD SI, 2 ; set SI=SI+2
SUB DI, 2 ; set DI=DI-2
LOOP @REPEAT ; jump to label @REPEAT while CX!=0
POP DI ; pop a value from STACK into DI
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 ; return control to the calling procedure
REVERSE_ARRAY ENDP
;**************************************************************************;
;-------------------------------- OUTDEC --------------------------------;
;**************************************************************************;
OUTDEC PROC
; this procedure will display a decimal number
; input : AX
; output : none
PUSH BX ; push BX onto the STACK
PUSH CX ; push CX onto the STACK
PUSH DX ; push DX onto the STACK
XOR CX, CX ; clear CX
MOV BX, 10 ; set BX=10
@OUTPUT: ; loop label
XOR DX, DX ; clear DX
DIV BX ; divide AX by BX
PUSH DX ; push DX onto the STACK
INC CX ; increment CX
OR AX, AX ; take OR of Ax with AX
JNE @OUTPUT ; jump to label @OUTPUT if ZF=0
MOV AH, 2 ; set output function
@DISPLAY: ; loop label
POP DX ; pop a value from STACK to DX
OR DL, 30H ; convert decimal to ascii code
INT 21H ; print a character
LOOP @DISPLAY ; jump to label @DISPLAY if CX!=0
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
RET ; return control to the calling procedure
OUTDEC ENDP
;**************************************************************************;
;--------------------------------------------------------------------------;
;**************************************************************************;
END MAIN
;**************************************************************************;
;**************************************************************************;
;------------------------------ THE END ---------------------------------;
;**************************************************************************;
;**************************************************************************;