; 
; Es. 9
; Scrivere un programma che riconosca il numero di coppie 01 conenute nella
; doppia locazione (16 bit) di nome ALPHA.
; Il numero di coppie di bit trovate e' lasciato nella locazione di nome RISU.
;
.MODEL	small
.stack	100h

.data 
    ; Variabili ALPHA e RISU. 
    ALPHA DW 0100110010111001B ; Valore di esempio
    RISU  DB 1 DUP (0)
    pkey  db 13,10,10,"premi un tasto...$"

.code
start:
	mov		ax,@data		; Get the address of the data segment
	mov		ds,ax			; Set the DS segment

    ; inizio codice esercizio
    ; conteggio coppie
    mov ax, ALPHA   ; copia del valore di ALPHA in ax
    mov bl, 0       ; inizializzazione del contatore
                    ; delle coppie trovate  
ciclo:              ; ciclo di analisi della parola
    mov dx, ax      ; 0100110010111001B (ax al primo passo)
    and dx, 0C000h  ; 1100000000000000B (maschera)
    cmp dx, 04000h  ; 0100000000000000B (coppia da cercare)
    jne scorrimento ; se non c'e' la coppia si scorre la parola
    inc bl          ; altrimenti si incrementa il numero
                    ; delle coppie trovate contenuto in bl
scorrimento:
    shl ax, 1     ; scorrimento di una posizione a sinistra di ax
    jnz ciclo     ; salta a ciclo fino a che ax non vale 0
    mov RISU, bl  ; copia il valore contenuto in bl in RISU
 
    ; fine dell'esercizio
 	mov		dx,offset pkey	; 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