; 
; Siano dato un vettore avente nome simbolico VETT contenenti 20 elementi ampi 1 byte,
; e una variabile avente nome simbolico N, contenete un numero compreso tra 1 e 20.
; Si calcoli la somma degli N elementi di un vettore.
;
.MODEL	small
.stack	100h

.data
	exitMsg	db "Premi un tasto per uscire",13,10,"$" 
    VETT 	db 10 dup (?)
    N    	db 3

.code
start:
	mov		ax,@data		; Get the address of the data segment
	mov		ds,ax			; Set the DS segment
     

;;; Inizio esercizio
	mov cl, N		; CL <- N ; CL e` l'indice che indica del ciclo che fornisce la
				    ; somma degli elementi.
	mov si, 0 		; SI <- 0 ; SI e` l'indice che punta all'elemento corrente del
				    ; vettore.
	mov al, 0		; AL <- 0 ; azzeriamo il contenuto del registro AL, che utilizzeremo
					; per salvare il risultato temporaneo della somma.
 
ciclo:
 	add al, VETT[si]; AL <- VETT[SI] : sommo ad AL il contenuto della locazione 
 					; di memoria avente indirizzo VETT + SI.
 	inc si			; SI++ : incremento l'indice per puntare al successivo elemento
 					; del vettore.  
 	dec cl			; CL-- : decremento l'indice che conta i passi del ciclo
 	jnz ciclo		; CL == 0 ? se no salta all'istruzione posta all'etichetta ciclo
 					; altrimenti prosegui.
;;; Fine esercizio
	mov		dx,offset exitMsg	; Get the address of our message in the DX
	mov		ah,9			; Function 09h in AH means "WRITE STRING TO STANDARD OUTPUT"
	int		21h				; Call the DOS interrupt (DOS function call)

	mov		ax,0C07h		; Function 0Ch = "FLUSH BUFFER AND READ STANDARD INPUT"
	int		21h				; Waits for a key to be pressed.
	
	mov		ax, 4C00h		; the exit fuction  [4C+no error (00)]
	int		21h				; call DOS interrupt 21h
end start
