# Program that computes the sum of an array. Place the sum in AX and also display it. Use Register Indirect Mode to access the array elements

``` .MODEL SMALL
.STACK 100H

.DATA
PROMPT  DB  \'The Array elements are : \$\'
RESULT  DB  0DH,0AH,\'The Sum of the Array is = \$\'

ARRAY   DB  10,20,30,40,50,60,70,80,90,100

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

MOV BX, 10                   ; set BX=10

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

MOV CX, BX                   ; set CX=BX
LEA SI, ARRAY                ; set SI=offset address of ARRAY

@LOOP:                       ; loop label
XOR AH, AH                 ; clear AH
MOV AL, [SI]               ; set AX=[SI]

CALL OUTDEC                ; call the procedure OUTDEC

INC SI                     ; set SI=SI+1

MOV AH, 2                  ; set output function
MOV DL, 20H                ; set DL=20H
INT 21H                    ; print a character

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

LEA SI, ARRAY                ; set SI=offset address of ARRAY

CALL SUM                     ; call the procedure SUM
CALL OUTDEC                  ; call the procedure OUTDEC

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

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

;---------------------------------  SUM  ----------------------------------;

SUM PROC
; this procedure will calculate the sum of an array
; input : SI=offset address of the array
;       : BX=size of the array
; output : AX=sum of the array

PUSH CX                        ; push CX onto the STACK
PUSH DX                        ; push DX onto the STACK

XOR AX, AX                     ; clear AX
XOR DX, DX                     ; clear DX
MOV CX, BX                     ; set CX=BX

@SUM:                          ; loop label
MOV DL, [SI]                 ; set DL=[SI]
ADD AX, DX                   ; set AX=AX+DX
INC SI                       ; set SI=SI+1

POP DX                         ; pop a value from STACK into DX
POP CX                         ; pop a value from STACK into CX

RET                            ; return control to the calling procedure
SUM 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

CMP AX, 0                      ; compare AX with 0

PUSH AX                        ; push AX onto the STACK

MOV AH, 2                      ; set output function
MOV DL, \"-\"                    ; set DL=\'-\'
INT 21H                        ; print the character

POP AX                         ; pop a value from STACK into AX

NEG AX                         ; take 2\'s complement of AX

@START:                        ; jump label

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