diff --git a/README.md b/README.md index 948272dae4d718f8391cef823eb1bcac09314634..6b6b01b210416ebdbc1af481d2a22bde3962726d 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,33 @@ Per eseguire le istruzioni nel simulatore di CPU, si consiglia di aprire il prog trasformato nella sezione **code** del simulatore. ## Soluzioni degli esercizi del libro -1. [Esercizio n. 13 pag. 53](libro/e13-quadrato.ed.txt) (Quadrato di un numero) -2. [Esercizio n. 14 pag. 53](libro/e14-sommaquad.ed.txt) (Somma di quadrati) -3. [Esercizio n. 16 pag. 53](libro/e16-multiplo7.ed.txt) (Multiplo di 7) -4. [Esercizio n. 17 pag. 53](libro/e17-conta5.ed.txt) (Conta cifra 5) -5. [Esercizio n. 18 pag. 53](libro/e18-potenza3.ed.txt) (Potenza di 3) -6. [Esercizio n. 20 pag. 53](libro/e20-palindromo.ed.txt) (Vettore palindromo) - - - - - +* [Esercizio n. 13 pag. 53](libro/e13-quadrato.ed.txt) (Quadrato di un numero) +* [Esercizio n. 14 pag. 53](libro/e14-sommaquad.ed.txt) (Somma di quadrati) +* [Esercizio n. 16 pag. 53](libro/e16-multiplo7.ed.txt) (Multiplo di 7) +* [Esercizio n. 17 pag. 53](libro/e17-conta5.ed.txt) (Conta cifra 5) +* [Esercizio n. 18 pag. 53](libro/e18-potenza3.ed.txt) (Potenza di 3) +* [Esercizio n. 20 pag. 53](libro/e20-palindromo.ed.txt) (Vettore palindromo) + +## Esercizi di programmazione in Assembly per CPU Sim + +1. [[maggiore](es/maggiore)] - Dati 2 numeri interi a e b memorizzati nelle celle 100 e 101, determinare il + numero maggiore e memorizzare il risultato nella cella 102. + +2. [[media](es/media)] - Dati 3 numeri memorizzati nelle celle 101, 102 e 103 determinare la media + aritmetica di tali numeri memorizzando il risultato nella cella 100. + (Nota: risolvere il problema senza ricorrere ai vettori). + +3. [[produttoria](es/produttoria)] - Dato un vettore di N numeri, determinare la "*PRODUTTORIA*" degli elementi + memorizzando il risultato in un'opportuna cella di memoria. + La produttoria è il risultato del prodotto di tutti gli elementi del vettore. + +4. [[contaneg](es/contaneg)] - Dato un vettore di N numeri interi con segno (positivi, negativi o nulli), + contare il numero di valori negativi presenti nel vettore e memorizzare + il risultato nella cella 100. + +5. [[multiplo5](es/multiplo5)] - Dato un numero N contenuto nella cella di memoria 100, determinare la cifra + delle unità memorizzandola nella cella 101. + Successivamente, utilizzare tale cifra per stabilire se il numero N sia + un multiplo di 5. + Se N è multiplo di 5, scrivere il numero 1 nella cella 102, altrimenti + scrivere 0. diff --git a/es/contaneg/contaneg.ed.txt b/es/contaneg/contaneg.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..55b7a54aab1f43807391e95e047b4ff834b7c340 --- /dev/null +++ b/es/contaneg/contaneg.ed.txt @@ -0,0 +1,61 @@ +; File: contaneg.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 16/11/2024 +; +; Descrizione: Dato un vettore di N numeri interi con segno (positivi, negativi o nulli), +; contare il numero di valori negativi presenti nel vettore e memorizzare +; il risultato nella cella 100. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; conta 100: ? (soluzione: 2) +; i 101: ? +; N 102: 5 (dimensione del vettore) +; v 103: 0 +; 104: -11 +; 105: 22 +; 106: -33 +; 107: 44 +; + + +SET A #0 +STO 101 ; i = 0 +STO 100 ; conta = 0 + +ciclo: +LOD R0 101 +LOD R1 102 +SUB +JMZ fine ; Salta alla fine del programma se i-N = 0 (cioè se i = N) + +LOD R0 101 ; Trasferimento del valore della variabile i nel registro A +SET R1 #0 +ADD +MOV IX ; Sposta A nel registro IX + +LOD R0 @103 ; Carica in R0 il valore di v[i] +SET R1 #0 ; +SUB ; Scrive v[i] nel registro A +JML negativo ; se A < 0, salta al codice di aggiornamento del contatore + +JMP continua ; se A non è negativo, continua con la parte rimanente del ciclo +negativo: +LOD R0 100 ; Incremento del contatore di numeri negativi (cella 100) +SET R1 #1 +ADD +STO 100 + +continua: +LOD R0 101 ; Incremento della variabile i +SET R1 #1 +ADD +STO 101 + +JMP ciclo + +fine: +HLT diff --git a/es/contaneg/contaneg.png b/es/contaneg/contaneg.png new file mode 100644 index 0000000000000000000000000000000000000000..2acc917ce2156e47736e9bdd8443f57787885113 Binary files /dev/null and b/es/contaneg/contaneg.png differ diff --git a/es/maggiore/maggiore.ed.txt b/es/maggiore/maggiore.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..17f1b03d2fd6a8c75a378b08166293fcad59e027 --- /dev/null +++ b/es/maggiore/maggiore.ed.txt @@ -0,0 +1,33 @@ +; File: maggiore.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 16/11/2024 +; +; Descrizione: Dati 2 numeri interi a e b memorizzati nelle celle 100 e 101, +; determinare il numero maggiore e memorizzare il risultato nella cella 102. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; a 100: 16 +; b 101: 9 +; max 102: ? (soluzione: 16) +; + +LOD R0 100 ; Carica i valori di a e b rispettivamente in R0 e R1 +LOD R1 101 +SUB +JMG magg_a ; Se A > 0, salta alla riga contrassegnata dalla label "magg_a" + +SET R0 #0 ; Se non ho eseguito il salto precedente, allora il maggiore è b e lo metto nel registro accumulatore +ADD +JMP fine ; Salta alla parte finale del programma + +magg_a: +SET R1 #0 ; Se arrivo qui, significa che a > b, quindi carico a nell'acculumatore +ADD + +fine: +STO 102 ; scrivo il valore dell'acculumatore nella cella del risultato +HLT diff --git a/es/maggiore/maggiore.png b/es/maggiore/maggiore.png new file mode 100644 index 0000000000000000000000000000000000000000..bded5e2ac03a67cffdd167551dabb4380c05e0f9 Binary files /dev/null and b/es/maggiore/maggiore.png differ diff --git a/es/media/media.ed.txt b/es/media/media.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..d51f105118ece06fcd40b41869ce81b014af3d62 --- /dev/null +++ b/es/media/media.ed.txt @@ -0,0 +1,33 @@ +; File: media.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 16/11/2024 +; +; Descrizione: Dati 3 numeri memorizzati nelle celle 101, 102 e 103 determinare la media +; aritmetica di tali numeri memorizzando il risultato nella cella 100. +; (Nota: risolvere il problema senza ricorrere ai vettori). +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; m 100: ? (soluzione: 5) +; x 101: 4 +; y 102: 8 +; z 103: 3 +; + + +LOD R0 101 ; Carica i valori di x e y rispettivamente in R0 e R1 +LOD R1 102 +ADD +MOV R0 ; Sposta la somma temporanea in R0 +LOD R1 103 ; Aggiunge z +ADD + +MOV R0 ; Sposta nuovamente la somma in R0 +SET R1 #3 ; Divide per il numero di valori processati +DIV + +STO 100 ; Memorizza la media finale nella variabile m (cella 100) +HLT diff --git a/es/media/media.png b/es/media/media.png new file mode 100644 index 0000000000000000000000000000000000000000..1b85ba9f91e3efc38da88fd4c136a15d7b8ef34e Binary files /dev/null and b/es/media/media.png differ diff --git a/es/multiplo5/multiplo5.ed.txt b/es/multiplo5/multiplo5.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..c6e74f16df24fcf6d284f75ec7b1e515424f1edd --- /dev/null +++ b/es/multiplo5/multiplo5.ed.txt @@ -0,0 +1,53 @@ +; File: multiplo5.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 16/11/2024 +; +; Descrizione: Dato un numero naturale N contenuto nella cella di memoria 100, determinare la cifra +; delle unità memorizzandola nella cella 101. +; Successivamente, utilizzare tale cifra per stabilire se il numero N sia +; un multiplo di 5. +; Se N è multiplo di 5, scrivere il numero 1 nella cella 102, altrimenti +; scrivere 0. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; N 100: 135 +; u 101: ? +; ris 102: ? (soluzione: 1) + + +; Calcolo delle unità di N mediante l'algoritmo del resto +LOD R0 100 ; Carica N in R0 +SET R1 #10 +DIV +MOV R0 ; Sposta il quoziente q in R0 +MUL ; Calcola q * 10 ... +MOV R1 ; ... e sposta il risultato in R1 + +LOD R0 100 ; Ricarica N in R0 +SUB ; Determina il resto della divisione come R0 - R1 (cioè N - q*10) +STO 101 ; Scrive il resto nella variabile delle unità + +; Per determinare se N sia un multiplo di 5, occorre confrontare u con lo zero e con il cinque. + +LOD R0 101 +SET R1 #0 +SUB +JMZ multiplo5 ; Se A = 0, allora u = 0 e il numero N è un multiplo di 5. + +SET R1 #5 +SUB +JMZ multiplo5 ; Se A = 0, allora u-5 = 0 (cioè u = 5) e il numero N è di nuovo un multiplo di 5. + +SET A #0 ; N non è multiplo di 5, ris = 0 +JMP fine + +multiplo5: +SET A #1 ; N è multiplo di 5, ris = 1 + +fine: +STO 102 ; Memorizza il risutato finale nella cella richiesta +HLT diff --git a/es/multiplo5/multiplo5.png b/es/multiplo5/multiplo5.png new file mode 100644 index 0000000000000000000000000000000000000000..f763baa983b755af5233a3ba35865d1716ab7b0a Binary files /dev/null and b/es/multiplo5/multiplo5.png differ diff --git a/es/produttoria/produttoria.ed.txt b/es/produttoria/produttoria.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..ded2350f2c42d7c8bc986acd288152c8688b3177 --- /dev/null +++ b/es/produttoria/produttoria.ed.txt @@ -0,0 +1,53 @@ +; File: produttoria.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 16/11/2024 +; +; Descrizione: Dato un vettore di N numeri, determinare la "PRODUTTORIA" degli elementi +; memorizzando il risultato in un'opportuna cella di memoria. +; La produttoria è il risultato del prodotto di tutti gli elementi del vettore. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; i 100: ? +; prod 101: ? (soluzione: 120) +; N 102: 4 (dimensione del vettore) +; v 103: 2 +; 104: 4 +; 105: 5 +; 106: 3 +; + + +SET A #0 ; i = 0 +STO 100 +SET A #1 ; prod = 1 +STO 101 + +ciclo: +LOD R0 100 +LOD R1 102 +SUB +JMZ fine ; Salta alla fine del programma se i-N = 0 (cioè se i = N) + +LOD R0 100 ; Trasferimento del valore della variabile i nel registro A +SET R1 #0 +ADD +MOV IX ; Sposta A nel registro IX + +LOD R0 101 ; Carica in R0 il prodotto elaborato fino a questo momento +LOD R1 @103 ; Carica in R1 il valore di v[i] +MUL ; Aggiorna la produttoria +STO 101 + +LOD R0 100 ; Incremento della variabile i +SET R1 #1 +ADD +STO 100 + +JMP ciclo + +fine: +HLT diff --git a/es/produttoria/produttoria.png b/es/produttoria/produttoria.png new file mode 100644 index 0000000000000000000000000000000000000000..189610f48c4b5142dfcc8e488b73175e74524cb5 Binary files /dev/null and b/es/produttoria/produttoria.png differ