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