;
; Esame 2006-01-10
;
; Considerati due vettori di nome simbolico VETT1 e VETT2 rispettivamente,
; aventi ciascuno 32 elementi da 8 bit,
; scrivere un programma in linguaggio Assembler 8086 che faccia quanto segue:
; 1.	memorizzi all'interno di un vettore VETT3,
;       avente le stesse caratteristiche di VETT1 e VETT2,
;       il risultato della somma degli elementi corrispondenti di VETT1 e VETT2;
; 2.	stampi su un terminale connesso alla porta dello spazio di I/O
;       avente nome simbolico TBR e registro di stato TSR,
;       il risultato della somma espresso decimale e rappresentato tramite 
;       caratteri ASCII e seguito dai caratteri di ritorno carrello e line feed;
; 3.	terminate tali operazioni ponga a 0 ogni elemento di VETT1 e di VETT2.
;
; Attenzione!
; Soluzione non conforme al testo: l'output e` stato re-indirizzato su video
; anziche' sulla porta di I/O TBR.

.MODEL small
.stack
.data
    ; Allocazione dei tre vettori
    VETT1 db 32 dup(1)
    VETT2 db 32 dup(2)
    VETT3 db 32 dup(?)
    pkey db "press any key...$"
.stack
.code
start:
    ; set segment registers:
    mov ax, @data
    mov ds, ax

    ; Inizio esercizio
    mov di, 0
ciclo:
    mov al, VETT1[di]
    add al, VETT2[di]
    mov VETT3[di], al
    call stampa
    inc di
    cmp di, 32
    jl  ciclo
    
    mov cx, 32
    mov di, 0
ciclo2:
	mov VETT1[di], 0
	mov VETT2[di], 0
	inc di
	loop ciclo2		dec cx
					cmp cx, 0
					jnz ciclo2

	; Fine esercizio    
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx    
    mov ah, 1      ; wait for any key....
    int 21h
    mov ax, 4c00h  ; exit to operating system.
    int 21h    
    
stampa proc
	mov ah, 0
    mov al, VETT3[di]
    mov bl, 100
    div bl  ; al = ax / dl, ah = ax % bl
    add al, 30H
    call output
    mov al, ah
    mov ah, 0
    mov bl, 10
    div bl  ; al = ax / dl, ah = ax % bl
    add al, 30H
    call output
    mov al, ah
    add al, 30H
    call output
    mov al, 13
    call output
    mov al, 10
    call output
    ret
stampa endp


output proc
    push ax
    mov ah, 2
    mov dl, al
    int 21h
    pop ax
    ret
output endp

end start ; set entry point and stop the assembler.