.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