# Metodo di indirizzamento

Nell'ambito della programmazione, l'indirizzamento è la definizione degli operandi (ad esempio, i campi dati) a cui si riferisce un'istruzione macchina. Gli operandi possono essere indirizzati in modi diversi (tipo di indirizzamento o modalità di indirizzamento), ad esempio specificandoli direttamente nell'istruzione o facendo riferimento a un indirizzo di memoria. La modalità di indirizzamento da utilizzare è determinata dal codice dell'operazione e dalle informazioni sugli operandi contenute nell'istruzione macchina solo in forma codificata.
Nella programmazione in linguaggio assembly, il programmatore stesso determina il tipo di indirizzamento, selezionando determinati codici di operazione (e i parametri associati). Quando si utilizzano linguaggi di programmazione superiori, le istruzioni macchina sono generate automaticamente dai compilatori (e quindi anche i loro tipi di indirizzamento sono definiti), di solito senza l'influenza diretta del programmatore. Il processore decodifica le istruzioni macchina durante l'esecuzione ed esegue i calcoli degli indirizzi corrispondenti, oltre a caricare i dati da utilizzare nell'istruzione.
Le diverse modalità di indirizzamento sono un aspetto della progettazione dei processori. Sono definite all'interno di una determinata architettura del set di istruzioni e determinano il modo in cui l'indirizzo di memoria effettivo (quello fisico) degli operandi viene determinato/calcolato per ogni istruzione del linguaggio macchina, ad esempio utilizzando le informazioni memorizzate nei registri e/o le costanti presenti all'interno dell'istruzione macchina.
Se un'istruzione si riferisce a più operandi (campi sorgente e/o destinazione), le informazioni necessarie per l'indirizzamento sono richieste/presenti separatamente per ciascun operando. Altri parametri contenuti nell'istruzione macchina (come le informazioni sulla lunghezza degli operandi, gli indicatori di salto da istruzioni logiche come uguale o maggiore) non vengono utilizzati per l'indirizzamento in senso stretto.

## La codifica

Gli indirizzi degli operandi sono inclusi in campi appositi delle istruzioni macchina date al calcolatore. In questi ci sono alcuni bit che specificano il metodo di indirizzamento. Sono 8, da 000b (0 decimale) a 111b ( =7 decimale), e si dividono in diretti e indiretti.
Alcuni metodi diretti sono:
* Diretto con Registro (codifica 000b)
* Immediato (codifica 001b)
* Assoluto (codifica 010b)
I metodi indiretti sono molteplici:
* indiretto con registro (codifica 011b)
* indiretto con spiazzamento (codifica 100b)
* relativo (codifica 101b)
* predecrementante (codifica 110b)
* postincrementante (codifica 111b)
nel caso di indirizzamenti indiretti l'istruzione non è formata solo dall'OL (Operation Long-word) ma anche da EL (Extension Long-word)

## Modalità diretta
### Implicito

L'opcode di una istruzione si riferisce già ad un certo particolare dato: si tratta in genere di istruzioni speciali.

### Con registro

L'operando è contenuto in uno dei registri della CPU che essendo interni al processore permettono un accesso veloce.

### Immediato

Il dato è presente in memoria nella locazione immediatamente successiva all'istruzione: è parte integrante dell'istruzione stessa. Non utilizza registri ma viene o specificato nell'istruzione il valore del dato oppure viene utilizzata una variabile che contiene il dato in memoria.

### Assoluto

Questo tipo di indirizzamento viene utilizzato se i dati hanno una posizione fissa nella memoria. Risulta essere più lento del Diretto con Registro perché anche se la modalità di accesso al dato è la stessa in questo caso si sta utilizzando un dato contenuto in memoria e non nei registri di CPU

## Modalità indiretta

L'istruzione specifica un registro della CPU (registro indice) che contiene l'indirizzo di memoria del dato necessario.

### Assoluta indiretta

In questo caso il valore contenuto nell'istruzione non rappresenta l'operando da utilizzare, ma l'indirizzo all'operando stesso. È una sorta di puntatore al dato richiesto. L'indirizzo puntatore che è contenuto nell'istruzione è memorizzato nell'EL

### Con registro indice

L'istruzione contiene sia un indirizzo immediato che l'indicazione di un registro: la CPU carica il dato dall'indirizzo ottenuto sommando il valore immediato al valore del registro.

### Autorelativa

L'istruzione contiene un dato immediato che viene sommato al valore del registro IP per ricavare l'indirizzo da cui caricare il dato necessario.

### Con spiazzamento

Nell'istruzione sono contenuti un dato in complemento a due e l'identificativo di un registro. La somma di questi due dati darà come risultato l'indirizzo fisico dell'operando.

### Predecrementante

Questo tipo di indirizzamento è utile nella scansione di array o dati in sequenza perché prima di accedere al dato decrementa il suo valore (dell'indirizzo e non del dato stesso).

### Postincrementante

Opposto al precedente questo indirizzamento prima legge il dato e poi incrementa il valore dell'indirizzo della dimensione specificata (Byte, Word o Long-word)