.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