diff --git a/IO/LEGGI_I.ASM b/IO/LEGGI_I.ASM
index e2ee0a44768af0999c9b1537f77fa7bfdf4140aa..2a49dd1f3e80d5d37a4a1e71ede4fa8615432c33 100644
--- a/IO/LEGGI_I.ASM
+++ b/IO/LEGGI_I.ASM
@@ -1,11 +1,11 @@
-;            File: LEGGI_U.ASM
+;            File: LEGGI_I.ASM
 ;
 ;          Autore: Roberto FULIGNI
 ;
-; Ultima modifica: 17/02/2022
+; Ultima modifica: 26/02/2022
 ;
 ;     Descrizione: Legge da tastiera un numero con segno a 16 bit 
-;                  utilizzando il servizio DOS 21h.
+;                  utilizzando i servizi DOS (INT 21h).
 ;                  Memorizza il risultato nel registro DX.
 ;
 
diff --git a/IO/LEGGI_U.ASM b/IO/LEGGI_U.ASM
index 7e04ef0f970bbb104c30282a6021c7368e1810f5..8b673d61543610c443173cb6ad1a928d532f4041 100644
--- a/IO/LEGGI_U.ASM
+++ b/IO/LEGGI_U.ASM
@@ -2,10 +2,10 @@
 ;
 ;          Autore: Roberto FULIGNI
 ;
-; Ultima modifica: 17/02/2022
+; Ultima modifica: 26/02/2022
 ;
 ;     Descrizione: Legge da tastiera un numero senza segno a 16 bit 
-;                  utilizzando il servizio DOS 21h.
+;                  utilizzando i servizi DOS (INT 21h).
 ;                  Memorizza il risultato nel registro DX.
 ;
 
diff --git a/IO/SCRIVI_I.ASM b/IO/SCRIVI_I.ASM
index 5d70b9867e2b9c0fcddaf46d18a475c0a0fe789d..088a09896ada475ec3987eac87b8bf2d23964a42 100644
--- a/IO/SCRIVI_I.ASM
+++ b/IO/SCRIVI_I.ASM
@@ -1,10 +1,11 @@
-;            File: SCRIVI_U.ASM
+;            File: SCRIVI_I.ASM
 ;
 ;          Autore: Roberto FULIGNI
 ;
-; Ultima modifica: 17/02/2022
+; Ultima modifica: 26/02/2022
 ;
-;     Descrizione: Scrive su monitor il valore di un numero con segno a 16 bit utilizzando il servizio DOS 21h.
+;     Descrizione: Scrive su monitor il valore di un numero con segno a 16 bit 
+;                  utilizzando i servizi DOS (INT 21h).
 ;                  Il numero da scrivere e' contenuto nel registro DX
 ;
 
diff --git a/IO/SCRIVI_U.ASM b/IO/SCRIVI_U.ASM
index 7a3f1e8c9f8f6d4eecbaf57294464104fda79892..0358bf24500c1cb1897579561be190a26458d691 100644
--- a/IO/SCRIVI_U.ASM
+++ b/IO/SCRIVI_U.ASM
@@ -2,9 +2,10 @@
 ;
 ;          Autore: Roberto FULIGNI
 ;
-; Ultima modifica: 17/02/2022
+; Ultima modifica: 26/02/2022
 ;
-;     Descrizione: Scrive su monitor il valore di un numero senza segno a 16 bit utilizzando il servizio DOS 21h.
+;     Descrizione: Scrive su monitor il valore di un numero senza segno a 16 bit
+;                  utilizzando i servizi DOS (INT 21h).
 ;                  Il numero da scrivere e' contenuto nel registro DX
 ;
 
diff --git a/README.md b/README.md
index 20d0e52d355b03c97508422c18a1f4df80c9da2b..2083ffee03d0e2c3ddb743c92fce57ec7594da33 100644
--- a/README.md
+++ b/README.md
@@ -9,8 +9,10 @@ libro di testo "Nuovo Sistemi e reti 1" (editore Hoepli)
 
 ## Soluzioni degli esercizi
 1. [Istruzioni di salto](U3L5) (Unità 3 Lezione 5)
+2. [Interazione con schermo e tastiera](U3L6) (Unità 3 Lezione 6)
+3. [Le istruzioni logiche e di manipolazione dei bit](U3L7) (Unità 3 Lezione 7)
 
-## Routine di Input/Output basate sul sevizio DOS 21h
+## Routine di Input/Output basate sui sevizi DOS (INT 21h)
 * ([LEGGI_U.ASM](IO/LEGGI_U.ASM)) - Lettura da tastiera di un numero senza segno a 16 bit
 * ([LEGGI_I.ASM](IO/LEGGI_I.ASM)) - Lettura da tastiera di un numero con segno a 16 bit
 * ([SCRIVI_U.ASM](IO/SCRIVI_U.ASM)) - Scrittura su monitor di un numero senza segno a 16 bit
diff --git a/U3L7/U3L7ES01.ASM b/U3L7/U3L7ES01.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..b85e5ac7afba77e6aeabd42db0986b6301a9ba3b
--- /dev/null
+++ b/U3L7/U3L7ES01.ASM
@@ -0,0 +1,87 @@
+;            File: U3L7ES01.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 25/02/2022
+;
+;     Descrizione: Data una tabella di numeri a partire dalla cella 0100h con valori a 16 bit, 
+;                  calcolare quanti numeri con bit di  posizione 12, 13 e 14 sono settati (valgono 1), 
+;                  contandoli e memorizzando il risultato nel registro AX.
+;
+
+TITLE SCRIVI_I
+.MODEL SMALL
+
+.STACK
+.DATA
+    TERMINATORE     EQU     0        ; Terminatore di tabella
+    MASCHERA        EQU     0E000h   ; 1110000000000000b
+    IND_INIZIALE    EQU     0100h
+    MSG             DB     'Contenuto del registro AX: ', '$'
+    ACAPO           DB     0Dh, 0Ah, '$'    
+    DIECI           DW      10
+.CODE
+    .STARTUP
+
+    ; Caricamento della tabella in memoria
+    MOV BX, IND_INIZIALE
+    MOV WORD PTR [BX],   0E000h         ; Si'
+    MOV WORD PTR [BX+2], 01234h         ; No
+    MOV WORD PTR [BX+4], 0FFFFh         ; Si'
+    MOV WORD PTR [BX+6], 0BBBBh         ; No
+    MOV WORD PTR [BX+8], TERMINATORE
+    
+    MOV AX, 0
+    
+CICLO:
+    MOV DX, [BX]
+    CMP DX, TERMINATORE
+    JE  FINE
+    
+    ; Controllo dei bit richiesti mediante maschera di AND
+    AND DX, MASCHERA
+    CMP DX, MASCHERA
+    JNE SUCCESSIVO
+    ; I bit 12, 13 e 14 sono tutti impostati a 1
+    INC AX
+SUCCESSIVO:
+    ADD BX, 2
+    JMP CICLO
+
+FINE:
+    ; Memorizzo il risultato nello stack per riutilizzare AX
+    PUSH AX
+    
+    ; Stampa del messaggio finale
+    MOV DX, OFFSET MSG
+    MOV AH, 09h
+    INT 21h
+    
+    POP AX       ; Recupera il risultato dallo stack
+    
+    ; Stampa del valore numerico di AX (considerato senza segno)
+    
+    MOV CX, 0
+ESTRAI_CIFRA:
+    MOV DX, 0
+    DIV DIECI    ; Divide DX:AX (un numero a 32 bit) per 10, ponendo il quoziente in AX e il resto in DX
+    ADD DX, '0'  ; Trasforma il resto nel codice ASCII della cifra numerica corrispondente
+    PUSH DX      ; La cifra e' depositata nello stack, sara' recuperata alla fine dell'algoritmo
+    INC CX
+    CMP AX, 0
+    JNE ESTRAI_CIFRA
+    
+    MOV AH, 02h
+STAMPA_CIFRA:
+    POP DX      ; Recupera dallo stack il codice ASCII della cifra da stampare
+    INT 21h     ; Stampa il carattere contenuto in DL
+    DEC CX
+    JNZ STAMPA_CIFRA
+    
+    ; Cursore a capo
+    MOV DX, OFFSET ACAPO
+    MOV AH, 09h
+    INT 21h
+    
+    .EXIT
+END
diff --git a/U3L7/U3L7ES02.ASM b/U3L7/U3L7ES02.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..39bec603ecbebb4e1fd46a09cf9ffcf7943bc17b
--- /dev/null
+++ b/U3L7/U3L7ES02.ASM
@@ -0,0 +1,72 @@
+;            File: U3L7ES02.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 26/02/2022
+;
+;     Descrizione: Date due variabili a 16 bit, “n” e “k”, mascherare con 01FFh (effettuare un'operazione AND) 
+;                  tutti i valori delle due variabili, quindi effettuare una OR tra i valori ottenuti, 
+;                  memorizzando il risultato nella variabile “x”. Infine stampa il risultato a video in 
+;                  binario (variabile x).
+;
+
+TITLE Esercizio n. 2 pag. 177
+.MODEL SMALL
+
+.STACK
+.DATA
+;     5AD2h AND 01FFh = 00D2h
+;     8B3Ch AND 01FFh = 013Ch
+;     00D2h OR  013Ch = 01FEh    (0000 0001 1111 1110b)
+
+    MASCHERA    EQU 01FFh
+    n           DW  5AD2h
+    k           DW  8B3Ch
+    x           DW  ?
+    ACAPO       DB  0Dh, 0Ah, '$'
+    DUE         DW  2
+.CODE
+    .STARTUP
+    
+    MOV AX, n
+    AND AX, MASCHERA
+    MOV DX, k
+    AND DX, MASCHERA
+    OR  AX, DX
+    MOV x, AX
+
+; caricamento dei singoli bit nello stack 
+    MOV CX, 16
+    MOV AX, x
+ESTRAI_CIFRA:
+    MOV DX, 0
+    DIV DUE
+    ADD DX, '0'
+    PUSH DX
+    DEC CX
+    JNZ ESTRAI_CIFRA
+
+    ; Stampa del numero x in binario (quattro nibble separati da uno spazio) 
+    
+    MOV CH, 4     ; CH: Contatore di nibble da stampare (4 nibble in un numero a 16 bit)  
+STAMPA_NIBBLE:
+    MOV CL, 4     ; CL: Contatore di bit da stampare per il nibble corrente (4 bit in un nibble) 
+STAMPA_BIT:
+    POP DX
+    MOV AH, 02h
+    INT 21h
+    DEC CL
+    JNZ STAMPA_BIT
+    
+    ; Stampa lo spazio separatore
+    MOV DL, ' '
+    INT 21h
+    DEC CH
+    JNZ STAMPA_NIBBLE
+    
+    MOV AH, 09h
+    MOV DX, OFFSET ACAPO
+    INT 21h
+   
+    .EXIT
+END
diff --git a/U3L7/U3L7ES03.ASM b/U3L7/U3L7ES03.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..3b4cfc13f83a49f535dbbccf74f6546520242dba
--- /dev/null
+++ b/U3L7/U3L7ES03.ASM
@@ -0,0 +1,85 @@
+;            File: U3L7ES03.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 26/02/2022
+;
+;     Descrizione: Memorizza un numero “segreto”, fingendo che venga generato dal computer. 
+;                  L’utente deve giocare con il  programma tentando di indovinare il numero “segreto”. 
+;                  Ad ogni tentativo fallito il computer comunica all’utente se il numero da indovinare 
+;                  è maggiore o minore. Utilizza il servizio di stampa stringa (09h) per comunicare 
+;                  all’utente il risultato.
+
+TITLE Esercizio n. 3 pag. 177
+.MODEL SMALL
+
+.STACK
+.DATA
+    DIECI        DW  10
+    SEGRETO      DW  8721
+    MSG_INPUT    DB  "Inserire un numero: $"
+    MSG_MINORE   DB  "Il numero segreto e' minore", 0Dh, 0Ah, '$'
+    MSG_MAGGIORE DB  "Il numero segreto e' maggiore", 0Dh, 0Ah, '$'
+    MSG_ESATTO   DB  "Hai indovinato il numero segreto!", 0Dh, 0Ah, '$'
+    
+.CODE
+    .STARTUP
+
+LETTURA_NUMERO:
+    MOV AH, 09h
+    MOV DX, OFFSET MSG_INPUT
+    INT 21h
+
+    ; Legge un numero senza segno e lo memorizza in BX
+    
+    MOV BX, 0               
+    MOV AH, 01h
+INIZIO_LETTURA:
+    INT 21h                     ; Scarta eventuali spazi iniziali
+    CMP AL, ' '             
+    JBE INIZIO_LETTURA      
+
+ELABORA_CIFRA:
+    CMP AL, '0'          
+    JB  CONFRONTA_SEGRETO  
+    CMP AL, '9'
+    JA  CONFRONTA_SEGRETO
+    
+    MOV AH, 0               
+    SUB AL, '0'            
+    PUSH AX                
+                           
+    ; Operazione BX = BX * 10 + AX
+    MOV AX, BX              
+    MUL DIECI               
+    MOV BX, AX              
+    
+    POP AX                  
+    ADD BX, AX              
+    
+    MOV AH, 01h             
+    INT 21h
+    JMP ELABORA_CIFRA
+
+CONFRONTA_SEGRETO:
+    CMP SEGRETO, BX
+    JE  ESATTO
+    JB  MINORE
+    ; A questo punto il numero segreto e' maggiore
+    MOV AH, 09h
+    MOV DX, OFFSET MSG_MAGGIORE
+    INT 21h
+    JMP LETTURA_NUMERO
+
+MINORE:
+    MOV AH, 09h
+    MOV DX, OFFSET MSG_MINORE
+    INT 21h
+    JMP LETTURA_NUMERO
+
+ESATTO:
+    MOV AH, 09h
+    MOV DX, OFFSET MSG_ESATTO
+    INT 21h
+    .EXIT
+END
diff --git a/U3L7/U3L7ES06.ASM b/U3L7/U3L7ES06.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..038781098c105516d6b964708071e7ac37e90f41
--- /dev/null
+++ b/U3L7/U3L7ES06.ASM
@@ -0,0 +1,103 @@
+;            File: U3L7ES06.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 26/02/2022
+;
+;     Descrizione: Scrivi un programma Assembly che dopo aver letto un numero a 8 bit
+;                  da tastiera conteggi il totale dei bit a 1 presenti nella cifra.
+;                  Tale valore deve essere memorizzato nella cella 0100h.
+
+TITLE Esercizio n. 6 pag. 177
+.MODEL SMALL
+
+.STACK
+.DATA
+    DIECI        DB  10
+    MSG_INPUT    DB  "Inserire un numero: $"
+    MSG_OUTPUT   DB  "Il conteggio dei bit 1 e': $"
+
+.CODE
+    .STARTUP
+
+LETTURA_NUMERO:
+    MOV AH, 09h
+    MOV DX, OFFSET MSG_INPUT
+    INT 21h
+
+    ; Legge un numero senza segno a 8 bit e lo memorizza in BL
+
+    MOV BL, 0
+    MOV AH, 01h
+INIZIO_LETTURA:
+    INT 21h                     ; Scarta eventuali spazi iniziali
+    CMP AL, ' '
+    JBE INIZIO_LETTURA
+
+ELABORA_CIFRA:
+    CMP AL, '0'
+    JB  ELABORAZIONE
+    CMP AL, '9'
+    JA  ELABORAZIONE
+
+    MOV AH, 0
+    SUB AL, '0'
+    PUSH AX
+
+    ; Operazione BL = BL * 10 + AL
+    MOV AL, BL
+    MUL DIECI
+    MOV BL, AL
+
+    POP AX
+    ADD BL, AL
+
+    MOV AH, 01h
+    INT 21h
+    JMP ELABORA_CIFRA
+
+ELABORAZIONE:
+    MOV CH, 0   ; Conteggio dei bit a 1
+    MOV CL, 8   ; Numero di ripetizioni
+
+CONFRONTA_BIT:
+    ROL BL, 1
+    JNC SUCCESSIVO
+    ; Il bit di carry e' 1, si incrementa CH
+    INC CH
+
+SUCCESSIVO:
+    DEC CL
+    JNZ CONFRONTA_BIT
+
+; Risultato finale
+
+    MOV BX, 0100h
+    MOV [BX], CH
+
+    MOV AH, 09h
+    MOV DX, OFFSET MSG_OUTPUT
+    INT 21h
+
+; Stampa del conteggio
+    MOV AL, CH   ; Copia il conteggio in AL
+
+    MOV CL, 0    ; Contatore delle cifre da stampare
+ESTRAI_CIFRA:
+    MOV AH, 0
+    DIV DIECI
+    ADD AH, '0'
+    PUSH AX         ; La cifra da stampare e' contenuta nella parte alta di AX
+    INC CL
+    CMP AL, 0
+    JNE ESTRAI_CIFRA
+
+    MOV AH, 02h
+STAMPA_CIFRA:
+    POP DX      ; Recupera dallo stack il codice ASCII della cifra da stampare
+    MOV DL, DH  ; Sposta il carattere nel registro DL
+    INT 21h
+    DEC CL
+    JNZ STAMPA_CIFRA
+    .EXIT
+END
diff --git a/U3L7/U3L7ES08.ASM b/U3L7/U3L7ES08.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..230d696362332cb2d45038b6f08ee20211802a96
--- /dev/null
+++ b/U3L7/U3L7ES08.ASM
@@ -0,0 +1,56 @@
+;            File: U3L7ES08.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 26/02/2022
+;
+;     Descrizione: Scrivi un programma Assembly che stampi a video il corrispondente in binario 
+;                  di un numero a 16 bit presente nella cella 0200 utilizzando le operazioni di scorrimento.
+
+TITLE Esercizio n. 8 pag. 177
+.MODEL SMALL
+
+.STACK
+.DATA
+    IND_INIZIALE EQU    0200h
+    NUMERO       EQU    0A3C9h
+    ACAPO        DB     0Dh, 0Ah, '$'
+
+.CODE
+    .STARTUP
+
+    MOV SI, IND_INIZIALE
+    MOV WORD PTR [SI], NUMERO
+    
+    MOV BX, [SI]      ; BX contiene ora il numero da elaborare
+    MOV CH, 4
+    MOV AH, 02h
+ELAB_NIBBLE:
+    MOV CL, 4
+
+ELAB_BIT:
+    ROL BX, 1
+    JC  BIT1
+    MOV DL, '0'
+    JMP STAMPA
+    
+BIT1:
+    MOV DL, '1'
+
+STAMPA:
+    INT 21h
+    
+    DEC CL
+    JNZ ELAB_BIT
+
+    MOV DL, ' '
+    INT 21h
+    DEC CH
+    JNZ ELAB_NIBBLE
+
+    MOV DX, OFFSET ACAPO
+    MOV AH, 09h
+    INT 21h
+    
+    .EXIT
+END
diff --git a/U3L7/U3L7ES17.ASM b/U3L7/U3L7ES17.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..e6f9f8db446f01b7ca450b782f2e1319f28d3cab
--- /dev/null
+++ b/U3L7/U3L7ES17.ASM
@@ -0,0 +1,88 @@
+;            File: U3L7ES17.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 26/02/2022
+;
+;     Descrizione: Dato un numero a 4 byte inserito da tastiera, che rappresenta una classe 
+;                  di indirizzo IP, scrivi un programma Assembly che verifichi a quale classe 
+;                  appartiene utilizzando la tecnica del mascheramento, sapendo che i bit 
+;                  più significativi del primo byte sono:
+;                  
+;                  CLASSE A   |0|
+;                  CLASSE B   |10|
+;                  CLASSE C   |110|
+;                  CLASSE D   |1110|
+;                  CLASSE E   |1111|
+
+TITLE Esercizio n. 17 pag. 178
+.MODEL SMALL
+
+.STACK
+.DATA
+    ; Esempi di indirizzi IP (uno per classe) 
+    ESEMPIO_A EQU  00AFE8001h   ; 10.254.128.1
+    ESEMPIO_B EQU  0AC100001h   ; 172.16.0.1
+    ESEMPIO_C EQU  0C0A80001h   ; 192.168.0.1
+    ESEMPIO_D EQU  0E0804020h   ; 224.128.64.32
+    ESEMPIO_E EQU  0FC7FFF01h   ; 252.127.255.1
+
+    MASK1     EQU  08000h       ; 1000 0000 0000 0000 b   testa il bit in posizione 15
+    MASK2     EQU  04000h       ; 0100 0000 0000 0000 b   testa il bit in posizione 14
+    MASK3     EQU  02000h       ; 0010 0000 0000 0000 b   testa il bit in posizione 13
+    MASK4     EQU  01000h       ; 0001 0000 0000 0000 b   testa il bit in posizione 12
+    
+    IP        DD   ESEMPIO_A    ; Provare anche gli altri indirizzi
+    
+    MSG       DB   'Indirizzo di classe $'
+    ACAPO     DB   0Dh, 0Ah, '$'
+    
+.CODE
+    .STARTUP
+    ; Indirizzo IP in AX
+    ; La classe dell'indirizzo sara' memorizzata in CL
+    
+    MOV BX, OFFSET IP
+    MOV AX, [BX + 2]    ; Carica la word piu' significativa dell'indirizzo in AX
+    
+    TEST AX, MASK1
+    JZ  CLASSE_A
+    TEST AX, MASK2
+    JZ  CLASSE_B
+    TEST AX, MASK3
+    JZ  CLASSE_C
+    TEST AX, MASK4
+    JZ  CLASSE_D
+
+    ; A questo punto l'indirizzo IP e' di classe E
+    MOV CL, 'E'
+    JMP STAMPA
+    
+CLASSE_A:
+    MOV CL, 'A'
+    JMP STAMPA
+CLASSE_B:
+    MOV CL, 'B'
+    JMP STAMPA
+CLASSE_C:
+    MOV CL, 'C'
+    JMP STAMPA
+CLASSE_D:
+    MOV CL, 'D'
+    
+STAMPA:
+    MOV AH, 09h
+    MOV DX, OFFSET MSG
+    INT 21h
+    
+    ; Stampa la classe
+    MOV AH, 02h
+    MOV DL, CL
+    INT 21h
+    
+    MOV AH, 09h
+    MOV DX, OFFSET ACAPO
+    INT 21h
+    
+    .EXIT
+END