diff --git a/README.md b/README.md index a29a66a42c012bc7a2b7babc8be0059f8a200b02..d873a5cf6a131fc6ea6326aed0520b2426fef5eb 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,20 @@ -# Esercizi Assembly CPU Sim +# Esercizi di Assembly per CPU Sim +© 2024 - prof. Roberto Fuligni +Materiale didattico per gli studenti dell'Istituto Tecnico Tecnologico "Giacomo Fauser" di Novara. -## Getting started +Soluzioni di alcuni degli esercizi di programmazione in Assembly per simulatore di CPU proposti dal +libro di testo "Corso di Sistemi e reti (vol. 1)" (editore Zanichelli). -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +I programmi sono stati scritti con il software *Editor per CPU Sim* e possono contenere +commenti oppure etichette per le istruzioni di salto. -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! +Per eseguire le istruzioni nel simulatore di CPU, si consiglia di aprire il programma con +*Editor per CPU Sim*, eseguire il comando **Copia e trasforma** e infine incollare il codice +trasformato nella sezione **code** del simulatore. -## Add your files +## Soluzioni degli esercizi del libro +1. [Esercizio n. 13 pag. 53](U3L5) (Quadrato di un numero) -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: -``` -cd existing_repo -git remote add origin https://git.netlab.fauser.edu/classi-terze/sistemi-e-reti/esercizi-assembly-cpu-sim.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://git.netlab.fauser.edu/classi-terze/sistemi-e-reti/esercizi-assembly-cpu-sim/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README - -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/libro/e13-quadrato.ed.txt b/libro/e13-quadrato.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..07285d1d97a0502f61bfcfaa79dea3c1e2f59eb1 --- /dev/null +++ b/libro/e13-quadrato.ed.txt @@ -0,0 +1,22 @@ +; File: e13-quadrato.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 19/10/2024 +; +; Descrizione: Scrivere un programma per il simulatore che calcoli il quadrato di un +; numero n inizialmente contenuto nella locazione di memoria di indirizzo 100, +; memorizzando il risultato nella locazione di memoria di indirizzo 101. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; n 100: 9 +; ris 101: ? (soluzione: 81) +; + +LOD R0 100 ; Carica il valore di n in R0 e R1 +LOD R1 100 +MUL ; Calcola R0 * R1 e mette il risultato nel registro A +STO 101 ; Memorizza il contenuto di A nella locazione di memoria di indirizzo 101 +HLT diff --git a/libro/e14-sommaquad.ed.txt b/libro/e14-sommaquad.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..639ffe8ca3ab72babf4916a418b7daf7391cf949 --- /dev/null +++ b/libro/e14-sommaquad.ed.txt @@ -0,0 +1,36 @@ +; File: e14-sommaquad.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 19/10/2024 +; +; Descrizione: Scrivere un programma per il simulatore che calcoli la somma dei quadrati +; di due numeri inizialmente contenuti rispettivamente nelle locazioni di +; memoria di indirizzi 100 e 101 memorizzando il risultato nella locazione +; di indirizzo 102. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; n1 100: 3 +; n2 101: 4 +; ris 102: ? (soluzione: 25) +; + +; Calcolo del quadrato di n1 +LOD R0 100 +LOD R1 100 +MUL +STO 102 ; Memorizza temporanemante il quadrato di n1 in ris + +; Calcolo del quadrato di n2 +LOD R0 101 +LOD R1 101 +MUL ; Il quadrato di n2 e' ora nel registro A + +; Somma dei risultati +LOD R0 102 ; Recupera il quadrato di n1 dalla cella di indirizzo 102 +MOV R1 ; Sposta il quadrato di n2 dal registro A al registro R1 +ADD ; Somma di quadrati +STO 102 ; Memorizza il risutato finale +HLT diff --git a/libro/e16-multiplo7.ed.txt b/libro/e16-multiplo7.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..8bf789655a89b3cff06a7c711cf2f2fd105d9fff --- /dev/null +++ b/libro/e16-multiplo7.ed.txt @@ -0,0 +1,43 @@ +; File: e16-multiplo7.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 19/10/2024 +; +; Descrizione: Scrivere un programma per il simulatore che verifichi se un +; numero n inizialmente contenuto nella locazione di memoria 100 +; è un multiplo di 7; in caso affermativo dovrà inserire il +; valore 1 nella locazione di memoria di indirizzo 101, in caso +; negativo dovrà inserirvi il valore 0. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; n 100: 14 +; ris 101: ? (soluzione: 1) +; + +; Per verificare se n contenga un multiplo di 7, occorre innanzitutto +; determinare il resto della divisione tra n e 7. + +LOD R0 100 ; Carica il valore d n +SET R1 #7 +DIV ; Elabora il quoziente q +MOV R0 ; Sposta il quoziente in R0 +MUL ; Calcola q * 7 +LOD R0 100 ; Carica nuovamente n in R0 +MOV R1 ; Sposta il risultato precedente (q*7) in R1 +SUB ; Determina il resto come differenza tra n e (q*7) e lo memorizza in A + +JMZ multiplo7 ; Salta in avanti se A è uguale zero (cioè se n è multiplo di 7) + +SET A #0 ; A questo punto n non è multiplo di 7, il risultato finale deve essere 0 +JMP memorizza ; Salta alla parte finale del programma + +multiplo7: +SET A #1 ; n è multiplo di 7, il risultato finale deve essere 1 + +memorizza: +STO 101 ; Memorizza il risultato finale dell'elaborazione (contenuto in A) nella + ; cella di indirizzo 101 (ris) +HLT diff --git a/libro/e17-conta5.ed.txt b/libro/e17-conta5.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..aa78a5730ba64a0aba1d20f0c532dae90ae7cac3 --- /dev/null +++ b/libro/e17-conta5.ed.txt @@ -0,0 +1,66 @@ +; File: e17-conta5.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 19/10/2024 +; +; Descrizione: Scrivere un programma per il simulatore che conti quante volte la +; cifra 5 è presente in un numero n inizialmente contenuto nella +; locazione di memoria 100 inserendo il risultato nella locazione +; di memoria 101. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; n 100: 535 +; conta 101: ? (soluzione: 2) +; temp 102: +; q 103: +; + +; Strategia: occorre ricavare da n la cifra delle unità , quindi rimuoverla +; dividendo n per 10 e ripetendo l'operazione fintantoché n > 0. +; A ogni ripetizione si aggiorna un apposito contatore se la cifra è 5. + +SET A #0 +STO 101 ; Azzera il contatore + +LOD R0 100 ; Preserviamo il valore di n copiandolo in una variabile temporanea +SET R1 #0 +ADD ; A <-- R0 + R1 +STO 102 ; ora si può operare sulla locazione di indirizzo 102 + +ciclo: +LOD R0 102 ; Ricavo la cifra delle unità di temp con l'algoritmo del resto +SET R1 #10 +DIV +STO 103 ; Conservo il valore del quoziente nella variabile q (indirizzo 103) +MOV R0 +MUL +LOD R0 102 +MOV R1 +SUB ; Ora le unità di temp sono presenti nel registro A + +; Occorre verificare se le unità siano 5... +MOV R0 ; Sposto le unità in R0 +SET R1 #5 +SUB ; Se le unità sono cinque, allora A deve essere esattamente 0 +JMZ unita5 +JMP continua ; Se le unità non sono 5, si continua semplicemente con l'algoritmo + +unita5: +LOD R0 101 ; Carico il contatore in R0... +SET R1 #1 +ADD ; ... lo incremento ... +STO 101 ; ... e infine lo salvo nuovamente nella locazione di memoria 101 + +continua: +LOD R0 103 ; recupero il quoziente elaborato il precedenza (di fatto è il numero + ; da elaborare privato delle unità ) ... +SET R1 #0 +ADD ; ... lo inserisco in A ... +STO 102 ; ... e lo salvo in temp + +JMG ciclo ; Se ci sono altre cifre da elaborare (A > 0), si ripete l'algoritmo + +HLT diff --git a/libro/e18-potenza3.ed.txt b/libro/e18-potenza3.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..666b998d17aa2301e50f9a13a1f29798050d1be8 --- /dev/null +++ b/libro/e18-potenza3.ed.txt @@ -0,0 +1,54 @@ +; File: e18-potenza3.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 19/10/2024 +; +; Descrizione: Scrivere un programma per il simulatore che verifichi se un numero n +; inizialmente contenuto nella locazione di memoria 100 è o meno una +; potenza di 3; in caso affermativo dovrà inserire il valore 1 nella +; locazione di memoria di indirizzo 101, altrimenti 0. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; n 100: 81 +; ris 101: ? (soluzione: 1) +; p 102: +; + +; Strategia: data una variabile p inizialmente pari a 1, si moltiplica ripetutamente +; p per tre finchè p < n. alla fine, se p = n, allora n è una potenza di 3, +; se p > n, n non è potenza di 3. + +SET A #1 ; Inizialmente p = 1 +STO 102 + +ciclo: +LOD R0 102 ; Controllo del ciclo in testa: carica la variabile p in R0 +LOD R1 100 ; Carica n in R1 +SUB ; A <-- R0 - R1 (cioè p - n) +JML triplica ; se p < n (cioè p-n < 0) occorre triplicare p +JMP fineciclo ; in caso contrario il ciclo termina + +triplica: +LOD R0 102 ; Triplica il valore della cella di indirizzo 102 (var. p) +SET R1 #3 +MUL +STO 102 +JMP ciclo + +fineciclo: +LOD R0 102 ; Occorre verificare se n sia una potenza di 3 confrontandola con p +LOD R1 100 +SUB +JMZ potenza3 ; se p - n = 0, si salta alla porzione di codice che gestisce il caso "n è potenza di 3" +SET A #0 ; n non è una potenza di 3, il risultato deve essere 0 +JMP fine + +potenza3: +SET A #1 ; n è potenza di 3, il risultato è quindi 1 + +fine: +STO 101 ; Memorizzazione del risultato finale nella cella 101 +HLT diff --git a/libro/e20-palindromo.ed.txt b/libro/e20-palindromo.ed.txt new file mode 100644 index 0000000000000000000000000000000000000000..91acb6d5f5bea35bb593e4dd520cfcfc7ab61c0e --- /dev/null +++ b/libro/e20-palindromo.ed.txt @@ -0,0 +1,91 @@ +; File: e20-palindromo.ed.txt +; +; Autore: Roberto FULIGNI +; +; Ultima modifica: 19/10/2024 +; +; Descrizione: Scrivere un programma per il simulatore che controlli se un vettore +; di d elementi è palindromo (ovvero se letto da destra a sinistra o +; viceversa fornisce sempre la stessa sequenza di valori). Sia d +; memorizzato nella locazione 109 della RAM e il vettore memorizzato +; a partire dalla locazione 110. Si inserisca nella locazione 100 il +; valore 1 o 0 a seconda che quanto richiesto sia vero o meno. +; +; MEMORIA RAM (DATA) +; Variabile Indirizzo Valore +; -------------------------------- +; ris 100: ? (soluzione: 1) +; i 101: +; j 102: +; a 103: +; b 104: +; d 109: 5 +; v 110: 22 +; 111: 33 +; 112: 44 +; 113: 33 +; 114: 22 +; + +SET A #0 +STO 101 ; i = 0 + +LOD R0 109 +SET R1 #1 +SUB +STO 102 ; j = d - 1 + +SET R0 #0 +SET R1 #1 +ADD +STO 100 ; ris = 1 + + +; controllo del ciclo: se i > j allora salta alla fine del programma + +ciclo: +LOD R0 101 +LOD R1 102 +SUB +JMG fine + +; Memorizzazione dell'indice i in IX (i è già presente in R0) +SET R1 #0 +ADD +MOV IX ; Sposta i da A a IX +LOD R0 @110 ; Carica l'elemento di v il cui indice è contenuto in IX +ADD +STO 103 ; a = v[i] + +; Memorizzazione dell'indice j in IX +LOD R0 102 +ADD +MOV IX +LOD R0 @110 +ADD +STO 104 ; b = v[j] + +; confronto tra a e b +LOD R0 103 +LOD R1 104 +SUB +JMZ aggiorna +; se a <> b, il vettore non è palindromo, si imposta ris = 0 e si termina il programma +SET A #0 +STO 100 +JMP fine + +aggiorna: +LOD R0 101 +SET R1 #1 +ADD +STO 101 ; i = i + 1 + +LOD R0 102 +SUB +STO 102 ; j = j - 1 + +JMP ciclo + +fine: +HLT diff --git a/libro/flowchart/es20pag53-Palindromo.pdf b/libro/flowchart/es20pag53-Palindromo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3edef3254dda089b0fa002bbfdc37b80f31eb1d0 Binary files /dev/null and b/libro/flowchart/es20pag53-Palindromo.pdf differ