# Program that declares and initialize a 2D array in row major order, and print the contents of the 3rd row and 4th column using Register Indirect mode

``` .MODEL SMALL
.STACK 100H

.DATA
PROMPT_1  DB  \'The contents of the 2D array are : \',0DH,0AH,\'\$\'
PROMPT_2  DB  0DH,0AH,\'The contents of the 3rd row are : \$\'
PROMPT_3  DB  0DH,0AH,\'The contents of the 4th column are : \$\'

ARRAY   DW  1,2,3,4,5
DW  6,7,8,9,10
DW  11,12,13,14,15
DW  16,17,18,19,20

.CODE
MAIN PROC
MOV AX, @DATA                ; initialize DS
MOV DS, AX

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
MOV CX, 4                    ; set CX=4

@LOOP_1:                     ; loop label
MOV BX, 5                  ; set BX=5

@LOOP_2:                   ; 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 BX                   ; set BX=BX-1

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

LEA DX, PROMPT_2             ; load and display the string PROMPT_2
MOV AH, 9
INT 21H

LEA SI, ARRAY                ; set SI=offset address of ARRAY
ADD SI, 20                   ; set SI=SI+20 : 3rd row=SI+2(5)(2)
MOV CX, 5                    ; set CX=5

@LOOP_3:                     ; 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

LEA DX, PROMPT_3             ; load and display the string PROMPT_3
MOV AH, 9
INT 21H

LEA SI, ARRAY                ; set SI=offset address of ARRAY
ADD SI, 6                    ; set SI=SI+6 : 4th column=SI+(4-1)(2)
MOV CX, 4                    ; set CX=4

@LOOP_4:                     ; 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, 10                 ; set SI=SI+10

MOV AH, 4CH                  ; return control to DOS
INT 21H
MAIN ENDP

;-------------------------  Procedure Definitions  ------------------------;

;--------------------------------  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

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

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
```