; 
; Siano dati due vettori avente nome simbolico VETT1 e VETT2 contenenti
; 10 elementi ampi 1 byte, e una variabile avente nome simbolico N, contenete
; un numero compreso tra 1 e 10.
; Si calcoli la somma degli elementi corrispondenti dei due vettori lasciando
; i risultati nei corrispondenti elementi del secondo vettore.
;

; Si calcoli la somma degli N elementi di un vettore.
;
.MODEL	small
.stack	100h

include ..\include\utils.inc
include ..\include\stdio.inc
include ..\include\ioNumbers.inc

.data
    VETT1 	db 3,4,7,5,9,2,8,6,1,0
    VETT2	db 4,10,3,8,9,23,12,9,14,19
    N    	db 7
    msg1	db "Programma per la somma degli elementi di due vettori.",13,10,13,10,"$"
    msg2	db "Elementi da sommare: $"
    msg3	db "Elementi [$"
    msg4	db "] $"
    msg5	db " + $"
    msg6	db " = $"

.code
start:
	call init
;;; Inizio esercizio
	mov dx, offset msg1
	call print			; Stampa msg1
	mov dx, offset msg2
	call print			; Stampa msg2
	mov al, N			
	call printBin8toDecASCII	; Stampa il num. di elem. da sommare
	call newline	; Stampa i caratteri per andare 'a capo';
	
	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.
 
ciclo:
	mov dx, offset msg3	; Stampa "Elemento ["
	call print	
	mov ax, si			; Stampa l'indice corrente del vettore
	call printBin8toDecASCII
	mov dx, offset msg4	; Stampa "] "
	call print
	mov al, vett1[si]	; Stampa il valore dell'elemento corrente del vettore VETT1
	call printBin8toDecASCII
	mov bl, al			; Salva il valore dell'elemento in BL
	mov dx, offset msg5 ; Stampa " + "
	call print
	mov al, vett2[si]	; Stampa il valore dell'elemento corrente del vettore VETT2
	call printBin8toDecASCII
	mov dx, offset msg6 ; Stampa " = "
	call print
	add	al, bl			; Somma AL + BL (VETT1[SI] + VETT2[SI])
	mov	vett2[si], al	; Lascia la somma in VETT2[SI]
	call printBin8toDecASCII
 	call newline
 	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
	call pressKeyAndExit
	
end start