vuoi
o PayPal
tutte le volte che vuoi
MODI DI INDIRIZZAMENTO
Come si apprende già dalla definizione, un algoritmo è una sequenza di passi che porta alla risoluzione di una classe di problemi. Un algoritmo in generale è trasformato in una sequenza di istruzioni, che costituiscono il vero e proprio programma. Ogni programma che si rispetti opera su dei dati e solitamente questi sono registrati in precise zone della memoria, sia essa memoria centrale o di massa. In particolare quando parliamo del processore ci si riferisce o ai registri di memoria interni al processore, o ai registri di memoria esterni al processore. Dunque se un programma lavora su dati conservati in memoria, significa che il programma deve avere accesso ad essi e i modi di indirizzamento indicano come la CPU accede agli operandi utilizzati nelle istruzioni del programma, scritti in registri interni o in memoria ed hanno la
La funzione di fornire un indirizzo effettivo per l'operando di un'istruzione. I modi di indirizzamento sono molteplici, in particolare quelli messi a disposizione dal 68000 e ai quali daremo un'occhiata sono:
- Indirizzamento immediato
- Indirizzamento diretto
- Indirizzamento assoluto
- Indirizzamento indiretto
- Predecremento e postincremento
- Indirizzamento con base
L'indirizzamento immediato si ha quando all'interno di un'istruzione si opera con una costante numerica. È facile riconoscere questo tipo di indirizzamento, in quanto all'interno del codice la costante è preceduta dal simbolo # (cancelletto). Questo tipo di indirizzamento è utilizzato unicamente per gli operandi di tipo sorgente. I numeri vengono automaticamente convertiti da decimale in esadecimale nella fase di memorizzazione. Per specificare una costante direttamente in esadecimale
basta aggiungere il simbolo $ davanti alla costante.Esempio:
#12,D0
Questa istruzione ha dunque come effetto quello di impostare il valore 12, ponendolo all'interno del registro D0, memorizzandone il valore mediante la numerazione esadecimale.
#$12,D0
INDIRIZZAMENTO DIRETTO (DIRECT ADDRESSING)
L'indirizzamento diretto avviene quando la sorgente e la destinazione di un operando sono entrambi registri. Se il registro funge da sorgente, allora il contenuto di questo registro fornisce l'operando sorgente. Se invece il registro è un operando destinazione, esso viene caricato con il valore specificato dall'istruzione.
Esempio:
D0,D1
Questa istruzione ha lo scopo di prendere il contenuto del registro D0 e di passarlo all'interno del registro D1.
MOVE.W D0,D1
La differenza sostanziale con il primo esempio è che nel primo caso abbiamo assegnato un valore costante ad un registro (D0), mentre in questo stiamo assegnando il contenuto di un registro (D0) ad un altro registro (D1).
valore numerico contenuto in un registro. In questo secondo caso sarebbelecito fare l'operazione all'inverso, diversamente dal primo.
D0,D1ADD.W D0 D05 5D1 D13 8(1) (2)
Il codice operativo ha la funzione di addizionare due operandi. In questo esempio viene preso il valore del ADDregistro aggiunto al valore numerico all'interno del registro e posto nuovamente in Questo tipo di istruzioneD0, D1 D1.
fornisce un esempio lampante di indirizzamento diretto.
Da ricordare che l'indirizzamento diretto tra registri interni gode della caratteristica di essere veloce nell'esecuzionedelle operazioni, fa uso di istruzioni corte, in quanto necessita unicamente di tre bit per selezionare uno degli ottoregistri disponibili e solitamente viene utilizzato dai programmatori per la registrazione di variabili utilizzatefrequentemente. ( )
INDIRIZZAMENTO ASSOLUTO ABSOLUTE ADDRESSING
L'indirizzamento assoluto è molto simile all'indirizzamento diretto, la differenza
Il testo fornito può essere formattato utilizzando i seguenti tag HTML:
sta nel fatto che invece di avere come operando i registri interni al processore, si va a richiamare, tramite indirizzo, una locazione della memoria.
Esempio:
112,D0
MOVE.W locazione di memoria D0
In questo caso viene effettuato l'accesso ad una zona della memoria contraddistinta dal numero 112. Da qui viene prelevato il dato e trasportato in D0.
Con questo modo di indirizzamento viene specificato direttamente l'indirizzo in memoria, anziché nei registri interni del processore, è un'operazione decisamente più onerosa.
( )INDIRIZZAMENTO INDIRETTO INDIRECT ADDRESSING
L'indirizzamento indiretto fa uso dei registri indirizzo, che sono atti a contenere indirizzi di memoria. All'interno dei registri indirizzo viene memorizzato l'indirizzo effettivo della variabile a cui il registro fa riferimento e viene modificata tramite esso. I registri indirizzo assumono la funzione
di puntatori.
Esempio (A0),D0
MOVE.B registro indirizziA01100 locazione dimemoria5 1100 D05registro datimemoria
All'interno del registro A0 è memorizzato l'indirizzo della cella da cui si deve prelevare il dato. Attraverso l'istruzione di MOVE.A01100 si ha come effetto lo spostamento del contenuto della zona puntata da A01100 (vale a dire la locazione di memoria) in D0.
Volendo tradurre in linguaggio naturale quell'istruzione avremmo: prendi il contenuto della cella il cui indirizzo è specificato in A01100 e spostalo nel registro dati D0.
PREDECREMENTO E POSTINCREMENTO
Questi due tipi di indirizzamento sono molto simili. Entrambi sono utilizzati su dei registri indirizzo, il primo ha la funzione di decrementare il contenuto del registro indirizzo prima che esso venga utilizzato; il secondo, invece, viene prima utilizzato e poi incrementato.
Esempio (A0)+,D0
MOVE.W A0 D055 (1)
A0 D056 (2)
In principio all'interno del registro indirizzi vi è memorizzato il valore 5,
tramite l'operazione diMOVE
viene trasportato all'interno del registro D0
, quindi il contenuto di A0
viene incrementato.
D0, A0-(A0),D0
Se all'inizio A0
contiene il valore 5, esso viene prima decrementato e poi passato al registro A0
D0
.
:INDIRIZZAMENTO CON BASE INDEXED ADDRESSING
Poniamo di aver definito un array e di voler accedere ad una determinata cella, se stessimo programmando in C++ la notazione che avremmo utilizzato sarebbe stata vet[n]
, possiamo avere un risultato analogo anche nell'assembly utilizzando l'indexed addressing. In realtà, quando scriviamo vet[n]
, stiamo richiedendo di avere accesso ad n
posizioni successive rispetto all'indirizzo in cui è memorizzato (ossia il primo elemento dell'array).
vet1000+4
vet[0]
vet[4]
Infatti, viene visto dal compilatore come l'indirizzo di memoria del primo elemento memorizzato e nelle parentesi quadre vet[n]
è il numero di posizioni che deve contare per accedere.all'elemento richiesto. Infatti potremmo tradurlo prendi
Se abbiamo capito questo ragionamento, allora basterà solamente imparare la
nuova sintassi perché come questo procedimento vale per il C++, così vale per l'assembly.
Esempio #4,
A0MOVE.L A(A0),D0MOVE.W
Supponiamo di aver definito un array A e di voler prelevare l'elemento A[4]. Muoviamo prima tramite
indirizzamento immediato il valore 4 nel registro dopo di che il compilatore prenderà
A0,Esercizio
Dato un array di word contenente interi, porre i valori della terza e della quarta word rispettivamente nei registri D0 e
D1 utilizzando l'indirizzamento diretto, indiretto e con base.
vettore800 4452
Supponiamo di aver definito un array monodimensionale di nome e che esso sia stato memorizzato alla
vettore
locazione di memoria 800.
INDIRIZZAMENTO DIRETTO
VET+4,D0MOVE.W VET+6,D1MOVE.W
Facciamo alcune osservazioni sul codice. In primis ricordiamo che scrivere
La label del vettore è assolutamente equivalente a scrivere l'indirizzo del primo elemento del vettore, dunque è come se avessimo scritto 800+4,D0.
Attenzione! Scrivere a sinistra della virgola il compilatore accetta l'addizione solo se a tempo di compilazione sono noti i valori di entrambi gli operandi, in questo caso di vet e 4. Il primo abbiamo detto essere totalmente equivalente all'indirizzo di memoria, il secondo è un numero perciò il compilatore accetta questa sintassi. Diversamente non è possibile utilizzare questo tipo di notazione. L'operazione di somma è effettuata dal compilatore e non dal processore.
Ora è lecito chiedersi perché per passare da una locazione di memoria all'altra bisogna aggiungere 2. Abbiamo definito un'array di word. Se aggiungessimo 1 andremmo avanti di 1 byte, con conseguente messaggio di errore generato dal compilatore.
INDIRIZZAMENTO INDIRETTO
VET+4,A0
MOVE.L (A0),D0
tutto equivalente a (A0)+,D0 il compilatore nell'incrementare MOVE.W
tiene in conto del size.