.MODEL SMALL
.STACK 100H
.DATA
PROMPT_1 DB 'The contents of Array before clearing 3rd row and 4th column are : ',0DH,0AH,'$'
PROMPT_2 DB 0DH,0AH,'The contents of Array after clearing 3rd row and 4th column are : ',0DH,0AH,'$'
ARRAY DW 1,2,3,4,5,6,7
DW 8,9,10,11,12,13,14
DW 15,16,17,18,19,20,21
DW 22,23,24,25,26,27,28
DW 29,30,31,32,33,34,35
.CODE
MAIN PROC
MOV AX, @DATA ; initialize DS
MOV DS, AX
MOV BH, 5 ; set BH=5
MOV BL, 7 ; set BL=7
LEA DX, PROMPT_1 ; load and print the string PROMPT_1
MOV AH, 9
INT 21H
LEA SI, ARRAY ; set SI=offset address of variable ARRAY
CALL PRINT_2D_ARRAY ; call the procedure PRINT_2D_ARRAY
PUSH BX ; push BX onto the STACK
MOV BX, 28 ; set BX=28 : first element of 3rd row
XOR SI, SI ; clear SI
MOV CX, 7 ; set CX=7 : size of row
@CLEAR_ROW: ; loop label
MOV ARRAY[BX][SI], 0 ; set ARRAY[BX][SI]=0
ADD SI, 2 ; set SI=SI+2 : next element of row
LOOP @CLEAR_ROW ; jump to label @CLEAR_ROW while CX!=0
MOV BX, 6 ; set BX=6 : first element of 4th column
XOR SI, SI ; clear SI
MOV CX, 5 ; set CX=5 : size of column
@CLEAR_COLUMN: ; loop label
MOV ARRAY[BX][SI], 0 ; set ARRAY[BX][SI]=0
ADD SI, 14 ; set SI=SI+14 : next element of column
LOOP @CLEAR_COLUMN ; jump to label @CLEAR_COLUMN while CX!=0
POP BX ; pop a value from STACK into BX
LEA DX, PROMPT_2 ; load and print the string PROMPT_2
MOV AH, 9
INT 21H
LEA SI, ARRAY ; set SI=offset address of variable ARRAY
CALL PRINT_2D_ARRAY ; call the procedure PRINT_2D_ARRAY
MOV AH, 4CH ; return control to DOS
INT 21H
MAIN ENDP
;**************************************************************************;
;**************************************************************************;
;------------------------- Procedure Definitions ------------------------;
;**************************************************************************;
;**************************************************************************;
;**************************************************************************;
;----------------------------- PRINT_2D_ARRAY ---------------------------;
;**************************************************************************;
PRINT_2D_ARRAY PROC
; this procedure will print the given 2D array
; input : SI=offset address of the 2D array
; : BH=number of rows
; : BL=number of columns
; output : none
PUSH AX ; 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
MOV CX, BX ; set CX=BX
@OUTER_LOOP: ; loop label
MOV CL, BL ; set CL=BL
@INNER_LOOP: ; loop label
MOV AH, 2 ; set output function
MOV DL, 20H ; set DL=20H
INT 21H ; print a character
MOV AX, [SI] ; set AX=[SI]
CALL OUTDEC ; call the procedure OUTDEC
ADD SI, 2 ; set SI=SI+2
DEC CL ; set CL=CL-1
JNZ @INNER_LOOP ; jump to label @INNER_LOOP if CL!=0
MOV AH, 2 ; set output function
MOV DL, 0DH ; set DL=0DH
INT 21H ; print a character
MOV DL, 0AH ; set DL=0AH
INT 21H ; print a character
DEC CH ; set CH=CH-1
JNZ @OUTER_LOOP ; jump to label @OUTER_LOOP if CX!=0
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 AX ; pop a value from STACK into AX
RET
PRINT_2D_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 ---------------------------------;
;**************************************************************************;
;**************************************************************************;