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