Ogni posizione nella memoria di un computer ha un indirizzo di memoria unico. Se conosci l'indirizzo della locazione che ti interessa, puoi accedere al contenuto di quella locazione di memoria. In molti sistemi informatici, ogni byte di memoria ha un indirizzo unico, ma questo non è vero per tutti i computer. Per esempio, ho lavorato su computer mainframe in cui ogni parola di memoria aveva un indirizzo unico, e ogni parola era lunga 60 bit.
Detto questo, per il resto di questa discussione, concentriamoci sui microprocessori tradizionali usati nei PC, e diciamo che ogni byte di memoria ha un indirizzo unico.
Prima di tutto, considerate gli indirizzi stradali delle case. Se si vuole indirizzare qualcuno verso una casa specifica, si hanno alcune scelte:
- Indirizzo assoluto
- Dare l'indirizzo esatto della casa che è la loro destinazione finale. Non importa da dove partono, saranno in grado di trovare la casa. Questo è noto come indirizzo assoluto.
- Indirizzo relativo
- Dai loro l'indirizzo esatto di una casa alla fine della strada di destinazione, e poi indirizzali alla casa di destinazione finale dicendo qualcosa come "poi vai due case a nord, e sei arrivato". Questo è noto come indirizzamento relativo, o indirizzo base/offset. L'indirizzo base, in questo caso, è l'indirizzo della casa all'angolo, e l'offset è il numero di case da percorrere da lì, prima di raggiungere la casa di destinazione.
- Diciamo che sai che la persona è già da qualche parte sulla strada di destinazione corretta, e sai dove sono. Potete quindi dargli il numero di case che deve andare, e una direzione sulla strada da prendere, per raggiungere la casa di destinazione finale. Questo è un altro esempio di indirizzamento relativo, o indirizzo base/offset. L'indirizzo di base, in questo caso, è la posizione della persona in questo momento, e l'offset è il numero di case da percorrere da lì, prima di raggiungere la casa di destinazione.
Ora, pensate ad ogni casa sulla strada come un byte della memoria del computer. Ognuna ha un indirizzo unico. Se guardate gli indirizzi dei byte adiacenti, vedrete che aumentano in una direzione e diminuiscono nella direzione opposta, come gli indirizzi delle case in una strada.
Se conoscete l'indirizzo esatto del byte che vi interessa, potete usare quell'indirizzo per accedere al contenuto di quel byte di memoria. Questo è l'indirizzamento assoluto - specifichi l'intero indirizzo di memoria del byte che ti interessa.
- Esempio: Avete una variabile globale con nome. Nella maggior parte dei linguaggi di programmazione generale, basta usare il nome, che è un alias per l'indirizzo di memoria della variabile.
Se conosci un indirizzo di base, e conosci la distanza tra quell'indirizzo di base e il byte che ti interessa (cioè l'offset dall'indirizzo di base al byte che ti interessa), puoi specificare sia l'indirizzo di base che l'offset per accedere al byte. Questo è l'indirizzamento relativo - specifichi un indirizzo di base e un offset da quell'indirizzo, per arrivare al byte che ti interessa.
- Esempio: Avete una variabile locale con nome. In molti linguaggi di programmazione generale, basta usare il nome, che il compilatore (o l'assemblatore) ha trasformato in un alias per l'offset dall'inizio dell'area dello stack usata per la memorizzazione della variabile locale. Internamente, l'indirizzo di base è un indirizzo nello stack, e l'offset è la distanza da quella posizione alla posizione della variabile locale a cui si sta accedendo.
- Esempio: Avete un array di byte con nome. In molti linguaggi di programmazione generale, usate il nome dell'array e un indice nell'array. Il compilatore (o assemblatore) ha trasformato il nome nell'indirizzo base dell'array...l'indirizzo del primo byte nell'array. L'indice che specifichi diventa l'offset...la distanza da quell'indirizzo di base al byte che ti interessa.
Infine, se conosci il tuo indirizzo attuale, e conosci la distanza tra quello in cui ti trovi ora e il byte che ti interessa (cioè l'offset dall'indirizzo attuale al byte che ti interessa), puoi specificare sia l'indirizzo di base che l'offset per accedere al byte. Questo è anche un indirizzamento relativo - specifichi un offset dall'indirizzo in cui ti trovi ora, per arrivare al byte che ti interessa.
- Esempio: Nei linguaggi assembly per molte architetture, ci sono istruzioni di salto relative. Invece di includere l'intero indirizzo di memoria di destinazione del salto all'interno dell'istruzione, solo un offset viene inserito nell'istruzione. Questo offset è la distanza, in byte, dalla posizione corrente (cioè, il contatore del programma corrente o il puntatore dell'istruzione) alla posizione a cui si vuole saltare. I salti relativi occupano tipicamente meno spazio in memoria e spesso vengono eseguiti più velocemente di un'istruzione di salto che contiene un indirizzo di memoria completo.