diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5ac347ed07315a3224423053b6ef099cfb6e90f2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+*.OBJ
+*.LST
+*.MAP
+*.EXE
diff --git a/README.md b/README.md
index 047477fada6dee5cfef7f84ec759732b35445f2f..f6e2e6059efd4e67ba16ae5fed9d5fe0c5f3f310 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,6 @@
-# Sample GitLab Project
+# Esercizi di Assembly 8086
 
-This sample project shows how a project in GitLab looks for demonstration purposes. It contains issues, merge requests and Markdown files in many branches,
-named and filled with lorem ipsum.
+Materiale didattico per gli studenti dell'Istituto Tecnico Tecnologico "Giacomo Fauser" di Novara.
 
-You can look around to get an idea how to structure your project and, when done, you can safely delete this project.
-
-[Learn more about creating GitLab projects.](https://docs.gitlab.com/ee/gitlab-basics/create-project.html)
+Soluzioni di alcuni degli esercizi di programmazione in Assembly proposti dal 
+libro di testo "Nuovo Sistemi e reti 1" (editore Hoepli)
diff --git a/TEMPLATE.ASM b/TEMPLATE.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..cac9a98086056c6045ed69123c102eb1367e1b83
--- /dev/null
+++ b/TEMPLATE.ASM
@@ -0,0 +1,20 @@
+;            File: .ASM
+;
+;          Autore:
+;
+; Ultima modifica:
+;
+;     Descrizione:
+;
+
+TITLE
+.MODEL SMALL
+
+.STACK 4096
+.DATA
+
+.CODE
+	.STARTUP
+	
+	.EXIT
+END
diff --git a/U3L5/U3L5ES01.ASM b/U3L5/U3L5ES01.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..2d7d5986cf373e9be8f67801baa34946253f577d
--- /dev/null
+++ b/U3L5/U3L5ES01.ASM
@@ -0,0 +1,61 @@
+;            File: U3L5ES01.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 06/02/2022
+;
+;     Descrizione: Incrementa il contenuto delle celle di indirizzo dispari e decrementa 
+;                  il contenuto delle celle di indirizzo pari di tutte le celle a partire 
+;                  dall’indirizzo 0300h. La tabella termina con il carattere ascii ‘@’. 
+;                  NB: Se le celle contengono zero devono essere lasciate inalterate
+;
+
+TITLE Esercizio n. 1 pag. 155 
+.MODEL SMALL
+
+.DATA
+	TERMINATORE		EQU		'@'
+	IND_INIZIALE	EQU		0300h
+	
+
+.CODE
+	.STARTUP
+	; Inserimento di alcuni dati di test a partire dall'indirizzo indicato
+	MOV	BX, IND_INIZIALE
+	MOV BYTE PTR [BX],   010h
+	MOV BYTE PTR [BX+1], 0
+	MOV BYTE PTR [BX+2], 015h
+	MOV BYTE PTR [BX+3], 020h
+	MOV BYTE PTR [BX+4], TERMINATORE
+	
+LEGGI_CELLA:
+	MOV AL, [BX]		; Copia la cella di memoria puntata da BX nel registro AL
+	CMP	AL, TERMINATORE
+	JE	FINE			; Se AL = '@', il programma deve terminare
+	CMP	AL, 0
+	JE	SUCCESSIVO  	; Nessuna modifica se il valore del registro è zero
+
+	; Per sapere se un numero sia pari o dispari, e' sufficiente controllare il
+	; suo bit lsb: se questo bit è 0, il numero e' pari, altrimenti e' dispari.
+	; L'istruzione TEST BX, 1, tramite un'operazione interna di AND, imposta il 
+	; flag ZF a 0 se il bit lsb di BX e' zero, lo imposta a 1 se lsb è uno. 	
+	
+	TEST BX, 1
+	JZ	PARI
+	
+	; L'indirizzo e' dispari, occorre incrementare il registro e memorizzarlo nella cella
+	INC	AL
+	MOV [BX], AL
+	JMP SUCCESSIVO
+	
+PARI:
+	; L'indirizzo e' pari, si decrementa il valore
+	DEC	AL
+	MOV [BX], AL
+	
+SUCCESSIVO:
+	INC BX				; BX punta ora alla cella successiva
+	JMP LEGGI_CELLA
+FINE:
+	.EXIT
+END
diff --git a/U3L5/U3L5ES02.ASM b/U3L5/U3L5ES02.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..c8663dad25c926b6fd944b2f4923ffb07e6ec442
--- /dev/null
+++ b/U3L5/U3L5ES02.ASM
@@ -0,0 +1,56 @@
+;            File: U3L5ES02.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 06/02/2022
+;
+;     Descrizione: Trasferisci il contenuto di 20 celle di memoria a partire 
+;                  dall’indirizzo 0100h fino all’indirizzo 0120h, per tutte 
+;                  le celle che non contengono un numero compreso tra 20h e A0h. 
+;
+
+TITLE Esercizio n. 2 pag. 155 
+.MODEL SMALL
+
+.STACK
+.DATA
+	NUM_CELLE		EQU		20
+	IND_INIZIALE	EQU		0100h
+	MINIMO			EQU     020h
+	MASSIMO         EQU     0A0h
+	
+	; Inizializzazione di un buffer di 20 celle
+	
+	BUFFER			DB	010h, 020h, 030h, 040h, 050h
+	                DB  060h, 070h, 080h, 090h, 0A0h
+					DB  0B0h, 0C0h, 0D0h, 0E0h, 0F0h
+					DB  011h, 021h, 031h, 0A1h, 0B1h
+	
+.CODE
+	.STARTUP
+	MOV	BX, IND_INIZIALE ; Indirizzo in cui trasferire il contenuto del buffer
+	MOV	CX, NUM_CELLE	 ; Contatore di celle da elaborare
+	MOV SI, 0
+	
+LEGGI_CELLA:
+	MOV AL, BUFFER + SI
+	CMP	AL, MINIMO
+	JB  TRASFERIMENTO	; Se AL è minore del valore minimo, lo si trasferisce in memoria
+	CMP	AL, MASSIMO
+	JA  TRASFERIMENTO   ; e anche se AL è maggiore del valore massimo
+	
+	; Il valore del registro non soddisfa i requisiti del problema, non si procede al 
+	; trasferimento in memoria e si passa al dato successivo
+	JMP SUCCESSIVO
+	
+TRASFERIMENTO:
+	MOV [BX], AL
+	INC BX
+
+SUCCESSIVO:
+	INC	SI
+	DEC CX
+	JNZ LEGGI_CELLA
+FINE:
+	.EXIT
+END
diff --git a/U3L5/U3L5ES03.ASM b/U3L5/U3L5ES03.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..be972b496c56b717adb2b132955ac7b2d84d333b
--- /dev/null
+++ b/U3L5/U3L5ES03.ASM
@@ -0,0 +1,52 @@
+;            File: U3L5ES03.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 06/02/2022
+;
+;     Descrizione: Trasferisci il contenuto di 10 celle di memoria a partire 
+;                  dall’indirizzo 0100h fino all’indirizzo 0120h, per le sole 
+;                  celle che contengono un numero compreso tra D000 e F000, 
+;                  con indirizzamento a 16 bit. 
+;
+
+TITLE Esercizio n. 3 pag. 155 
+.MODEL SMALL
+
+.STACK
+.DATA
+	NUM_CELLE		EQU		10
+	IND_INIZIALE	EQU		0100h
+	MINIMO			EQU     0D000h
+	MASSIMO         EQU     0F000h
+	
+	; Inizializzazione di un buffer di 10 word
+	
+	BUFFER			DW	01000h, 04000h, 08000h, 0B000h, 0D000h
+	                DW	0E000h, 0F000h, 0FFFFh, 00000h, 0D001h
+	
+.CODE
+	.STARTUP
+	MOV	BX, IND_INIZIALE ; Indirizzo in cui trasferire il contenuto del buffer
+	MOV	CX, NUM_CELLE	 ; Contatore di celle da elaborare
+	MOV SI, 0
+	
+LEGGI_CELLA:
+	MOV AX, BUFFER + SI
+	CMP	AX, MINIMO
+	JB  SUCCESSIVO	    ; Se AX è minore del valore minimo, si passa al valore successivo
+	CMP	AX, MASSIMO
+	JA  SUCCESSIVO      ; e anche se AX è maggiore del valore massimo
+	
+	; Il valore del registro soddisfa i requisiti del problema, si procede al 
+	; trasferimento in memoria e si passa al dato successivo
+	MOV [BX], AX
+	ADD BX, 2
+
+SUCCESSIVO:
+	ADD	SI, 2
+	DEC CX
+	JNZ LEGGI_CELLA
+FINE:
+	.EXIT
+END
diff --git a/U3L5/U3L5ES04.ASM b/U3L5/U3L5ES04.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..a1520aa8d39d6e72241641c83fc1ff7c1a12fc32
--- /dev/null
+++ b/U3L5/U3L5ES04.ASM
@@ -0,0 +1,64 @@
+;            File: U3L5ES04.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 06/02/2022
+;
+;     Descrizione: Aggiungi 20h al contenuto di tutte le celle (indirizzate  a  16  bit)  
+;                  di indirizzo multiplo di tre e azzera tutte le rimanenti, a partire
+;                  dall’indirizzo 0100h. La cella precedente alla 0100h contiene il numero
+;                  di celle da elaborare.
+;                  NB: Se le celle contengono un valore che eccede la dimensione della cella 
+;                  stessa deve devono essere lasciate inalterate. 
+;
+
+TITLE Esercizio n. 4 pag. 155 
+.MODEL SMALL
+
+.STACK
+.DATA
+	NUM_CELLE		EQU		5
+	IND_INIZIALE	EQU		0100h
+	
+.CODE
+	.STARTUP
+	; Inizializzazione di quattro word senza segno in memoria a partire dall'indirizzo indicato
+	MOV	BX, IND_INIZIALE
+	MOV WORD PTR [BX],   0A00h
+	MOV WORD PTR [BX+2], 0FFF0h
+	MOV WORD PTR [BX+4], 04CA0h
+	MOV WORD PTR [BX+6], 0FFFFh
+	MOV WORD PTR [BX+8], 0ABCDh
+	; Memorizzazione del numero di word da elaborare 
+	MOV BYTE PTR [BX-1], NUM_CELLE
+	
+	; Acquisizione del numero di celle da elaborare
+	MOV BX, IND_INIZIALE
+	MOV CL, [BX-1]
+	
+INIZIO:
+	CMP CL, 0
+	JE	FINE
+	; Riconoscimento dell'indirizzo multiplo di tre
+	MOV AX, BX		  ; Caricamento dell'indirizzo da analizzare in AX
+	MOV DL, 3
+	DIV DL            ; Divide AX per DL -> Quoziente in AL, Resto in AH
+	CMP AH, 0
+	JE  MULTIPLO3
+	; L'indirizzo non e' multiplo di 3, si azzera la word
+	MOV WORD PTR [BX], 0
+	JMP SUCCESSIVO
+	
+MULTIPLO3:
+	MOV	AX, [BX]	; Carica la word puntata da BX nel registro AX
+	ADD AX, 020h    ; Addizione con operandi considerati senza segno
+	JC  SUCCESSIVO	; Se l'addizione produce un riporto, la cella non deve essere modificata
+	MOV [BX], AX    ; Aggiornamento della word in memoria
+
+SUCCESSIVO:
+	ADD	BX, 2		; Spostiamo il puntatore alla word successiva
+	DEC CL	        ; Decrementiamo il contatore di word da elaborare
+	JMP INIZIO
+FINE:
+	.EXIT
+END
diff --git a/U3L5/U3L5ES08.ASM b/U3L5/U3L5ES08.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..9206576a9ee7d1031de01d8dd5b7d3870dbfb44e
--- /dev/null
+++ b/U3L5/U3L5ES08.ASM
@@ -0,0 +1,58 @@
+;            File: U3L5ES08.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 06/02/2022
+;
+;     Descrizione: Dopo aver inserito dieci numeri nelle celle di indirizzo 
+;                  da 0100 a 0109 scrivi un programma Assembly che cerchi il 
+;                  numero maggiore e lo copi nella cella successiva (010Ah).
+;
+
+TITLE Esercizio n. 8 pag. 155 
+.MODEL SMALL
+
+.STACK
+.DATA
+	NUM_CELLE		EQU		10
+	IND_INIZIALE	EQU		0100h
+	
+.CODE
+	.STARTUP
+	; Inizializzazione dell'area di memoria (numeri interi segna segno)
+	MOV	BX, IND_INIZIALE
+	MOV BYTE PTR [BX],   010h
+	MOV BYTE PTR [BX+1], 020h
+	MOV BYTE PTR [BX+2], 030h
+	MOV BYTE PTR [BX+3], 040h
+	MOV BYTE PTR [BX+4], 011h
+	MOV BYTE PTR [BX+5], 021h
+	MOV BYTE PTR [BX+6], 031h
+	MOV BYTE PTR [BX+7], 041h
+	MOV BYTE PTR [BX+8], 012h
+	MOV BYTE PTR [BX+9], 022h
+
+	
+	MOV BX, IND_INIZIALE
+	MOV CX, NUM_CELLE
+	MOV DL, 0               ; Contiene il valore massimo temporaneo
+	
+LEGGI_CELLA:
+	MOV AL, [BX]		  ; Caricamento del byte da analizzare in AL
+	CMP AL, DL            ; Confronto con il massimo temporaneo
+	JBE SUCCESSIVO        ; Se AL non è piu' grande di DL, si passa al dato successivo
+	
+	; In AL e' presente un nuovo massimo temporaneo, si aggiorna DL
+	MOV DL, AL
+
+SUCCESSIVO:
+	INC	BX		    ; Passaggio alla cella successiva
+	DEC CX	        
+	JNE LEGGI_CELLA
+	
+FINE:
+    ; Prima di finire, si memorizza il valore massimo nella cella 010Ah
+	; Si noti che, alla fine del ciclo, questo indirizzo e' gia' contenuto in BX
+	MOV [BX], DL
+	.EXIT
+END
diff --git a/U3L5/U3L5ES18.ASM b/U3L5/U3L5ES18.ASM
new file mode 100644
index 0000000000000000000000000000000000000000..154080411917baed0ab9b8a1aa079ad41498dbc1
--- /dev/null
+++ b/U3L5/U3L5ES18.ASM
@@ -0,0 +1,64 @@
+;            File: U3L5ES18.ASM
+;
+;          Autore: Roberto FULIGNI
+;
+; Ultima modifica: 06/02/2022
+;
+;     Descrizione: Scrivi un programma Assembly che memorizzi in una tabella, a 
+;                  partire dall’indirizzo 0100h, un numero imprecisato di caratteri 
+;                  ASCII terminanti con il simbolo ‘$’. Il programma deve determinare 
+;                  se i caratteri formano una parola palindroma, come per esempio:
+;                  otto; radar; ingegni; anilina; itopinonavevanonipoti
+;
+
+TITLE Esercizio n. 18 pag. 155 
+.MODEL SMALL
+
+.STACK
+.DATA
+	IND_INIZIALE	EQU		0100h
+	
+.CODE
+	.STARTUP
+	; Il risultato dell'elaborazione sara' memorizzato nel registro DL secondo
+	; la seguente convezione: 
+	;     DL = 0 -> stringa non palindroma
+	;     DL = 1 -> stringa palindroma
+	MOV DL, 0    ; All'inizio si suppone che la stringa non sia palindroma
+	
+	; Copia la stringa nell'area di memoria a partire dall'indirizzo indicato
+	MOV	BX, IND_INIZIALE
+	MOV BYTE PTR [BX],   'o'
+	MOV BYTE PTR [BX+1], 'r'
+	MOV BYTE PTR [BX+2], 't'
+	MOV BYTE PTR [BX+3], 'o'
+	MOV BYTE PTR [BX+4], '$'
+
+	; Posizionamento del registro indice DI sull'ultimo carattere della stringa
+	MOV DI, 0
+RICERCA:
+	CMP BYTE PTR [BX+DI], '$'
+	JE  FINERICERCA
+	INC	DI
+	JMP RICERCA
+	
+FINERICERCA:
+	DEC DI          ; Indice dell'ultimo carattere
+	MOV SI, 0		; Indice del primo carattere
+	
+CONTROLLO:
+	CMP SI, DI
+	JA PALINDROMA   ; Se l'indice SI ha oltrepassato DI, la stringa e' palindroma
+	MOV AL, [BX+SI]
+	CMP AL, [BX+DI]
+	JNE FINE        ; Se [BX+SI] e [BX+DI] sono diversi, il programma finisce (non palindroma)
+	INC SI
+	DEC DI
+	JMP CONTROLLO
+	
+PALINDROMA:
+	MOV DL, 1
+FINE:
+	; Osservare il valore del registro DL
+	.EXIT
+END
diff --git a/clean.bat b/clean.bat
new file mode 100644
index 0000000000000000000000000000000000000000..3243effa730398ac851304f81b7c562aff7d5c23
--- /dev/null
+++ b/clean.bat
@@ -0,0 +1,5 @@
+@ECHO OFF
+DEL /S /Q *.OBJ
+DEL /S /Q *.MAP
+DEL /S /Q *.LST
+DEL /S /Q *.EXE