vuoi
o PayPal
tutte le volte che vuoi
LOOP PER ALLOCAZIONE DI INTERI IN UN VETTORE
Attraverso questo esercizio ci prefiggiamo di allocare un vettore di n posizioni con i primi n numeri naturali, tramite l'utilizzo di un loop.
Cominciamo col definire tutto ciò che ci occorre per completare l'esercizio. Ciò che serve è:
- un vettore;
- una variabile numerica che ci dica quante posizioni allocare;
- una variabile che ci permetta di inserire i valori all'interno del vettore.
Volendo partire col dichiarare ciò che abbiamo detto, abbiamo:
$8100
ORG
VET 10
DS.W
In realtà abbiamo con questa istruzione allocato solamente dello spazio per porre in memoria i numeri del vettore. Le altre due variabili saranno dei registri di sistema. Questo consente al sistema di generare del codice più corto e di accedere alla memoria meno frequentemente, facendo risultare il processo più veloce.
Una volta che sappiamo su cosa possiamo operare, possiamo procedere alla...
progettazione del nostro codice. Facciamouna riflessione: il nostro programma sa dove prelevare e dove scrivere i dati, se gli vengono specificati di volta in voltagli indirizzi. Se avessimo un vettore di 1000 posizioni sarebbe disumano pensare di poter scrivere gli indirizzi di ognisingola cella di memoria componente il vettore. Dunque possiamo fare in modo di prendere il primo indirizzo delvettore e di incrementarlo di volta in volta, sino a riempirlo tutto. Come sappiamo, l'Asim fa uso delle cosiddette label,vale a dire delle etichette che contraddistinguono una certa locazione di memoria. In altre parole utilizzare una labelall'interno del nostro algoritmo equivale a fornire l'indirizzo della locazione di memoria, alla quale vogliamo riferirci.
vett ---- ----9000 9001 9002
Supponiamo di avere definito un array di tre posizioni e di averlo chiamato Scrivere vett all'interno dell'algoritmo vett.oppure 9000, cioè il suo indirizzo di memoria, avrebbe
Pari risultato. Ma come raggiungere le posizioni 9001 e 9002 che non hanno un nome? È sufficiente copiare il primo indirizzo di memoria dell'array in un registro indirizzi, di volta in volta, incrementare il valore e in questo modo avere accesso alle altre posizioni.
Chiariamoci ulteriormente le idee facendo un confronto tra l'asim e il C++. Quando vogliamo accedere in C++ ad un array attraverso puntatore, basta assegnare al puntatore il nome dell'array, questo perché al nome dell'array corrisponde l'indirizzo di memoria dal quale l'array parte e dunque al puntatore viene assegnato il valore dell'indirizzo.
a[10]; //dichiarazione del vettore.
int p; //dichiarazione del puntatore al vettore.
int* p = a; //assegnazione dell'indirizzo di memoria al puntatore.
(*(p+1)) = 3; //abbiamo assegnato alla locazione a[1] il valore 3.
In modo del tutto analogo avviene il processo all'interno dell'Asim. Capito il meccanismo, il nostro
compito diventamolto più semplice. Suddividiamo il codice in due parti, la fase iniziale di preparazione dei dati e la fase diassegnazione dei valori al vettore vera e propria.
START
Affrontiamo in questa sezione la preparazione di tutto ciò che deve essere allocato. Carichiamo allora l’indirizzo dellaprima cella del vettore all’interno del registro indirizzi e poniamo il valore costante 10, all’interno di un registro dati.
$8000ORGSTART #VET,A0
MOVEA.L #10,D0
MOVE.BDomanda – I codici operativi della prima e della seconda istruzione sembrano diversi, perché hanno lostesso effetto?
Nel primo caso l’indirizzo del vettore viene mosso all’interno di un registro indirizzi, invece nel secondo caso è unVETvalore costante ad essere copiato all’interno di un registro dati. Pertanto nel primo caso occorre usare il (moveMOVEAnel secondo un sempliceaddress), MOVE.LOOPL’utilizzo di codici operativi semplici permettono sì
Una rete di controllo più semplice del sistema, ma alle volte impediscono la facile implementazione di alcune operazioni. In questo caso c'è bisogno di operare dieci assegnazioni, se stessimo nel C++ potremmo scrivere cioè vale a dire fin quando il valore di i rimane al di sotto di 10, (i<10), Fare questo tipo di operazione in compara il valore attuale i con il 10 finché i non rimane al di sotto di questo valore. Asim è decisamente complesso, per cui non ci rimane che optare per una soluzione più semplice. Eseguiamo un ciclo a decremento e al processore di sottrarre il valore 1 a 10 ad ogni ciclo ed il risultato viene assegnato man mano diciamo all'interno delle caselle, finché questo non diventa 0. Dunque D0 funge sia da contatore e sia da valore di input da posizionare all'interno del vettore.