ELEMANIA
Z80 - Modi di indirizzamento
Modi di indirizzamento

Una istruzione può operare su uno o più operandi. In generale tali operandi possono essere:

a) contenuti nei registri interni della CPU;
b) contenuti nelle locazioni della memoria;
c) provenienti da circuiti periferici di Input/Output.

Con il termine modo di indirizzamento si intende il metodo con cui la CPU, per una data istruzione, ricava il dato su cui dovrà operare.

Vediamo ora nel seguito i principali modi di indirizzamento utilizzati dallo Z80.

Indirizzamento di registro

In questo modo di indirizzamento, nel codice operativo sono già contenute le informazioni che specificano il registro (o i registri) della CPU su cui lavorare. Quindi il solo codice operativo è sufficiente per capire il ruolo che avranno i registri nell'istruzione da eseguire. Esempio:

LD A,D

In questo esempio, l'istruzione richiede di effettuare la copia del contenuto del registro D in A. Gli operandi sono entrambi registri e non è necessario specificare indirizzi. Il codice macchina dell'istruzione è costituito dal solo codice operativo (7Ah).

Indirizzamento implicito

In questo caso, come suggerisce il nome, l'operando è implicito, cioè non è espresso esplicitamente nell'istruzione. Per esempio l'istruzione CPL complementa a 2 il contenuto dell'accumulatore A, ma l'accumulatore non viene espresso esplicitamente nell'istruzione.

In effetti è molto frequente che il registro accumulatore non venga esplicitamente espresso nell'istruzione come in:

OR 0Ah

effettua l'OR bit a bit fra il contenuto dell'accumulatore e il numero 05h e memorizza il risultato nell'accumulatore stesso. Altre volte l'accumulatore viene espresso esplicitamente come sorgente dei dati ma viene sottinteso come destinazione, ad esempio:

ADD A,L

Questa istruzione esegue la somma fra il contenuto di A e il contenuto di L e memorizza il risultato nuovamente in A (anche se non è espresso esplicitamente).

 

Indirizzamento immediato (a 8 bit)

Nel modo immediato l'operando è un valore costante a 8 bit ed è posto immediatamente dopo il codice di istruzione. Per esempio l'istruzione

LD A,00h

carica nel registro A il valore 00h. Tale valore viene specificato immediatamente dopo il byte del codice operativo dell'istruzione. Pertanto il codice macchina corrispondente è

3E 00h

dove 3E è il codice operativo e 00 e il valore dell'operando.

Al momento della esecuzione del programma, dopo avere eseguito il prelievo del codice operativo, il microprocessore preleva immediatamente l'operando sorgente dal byte successivo, utilizzando semplicemente il registro PC (Program Counter) per indirizzarlo.

Un altro semplice esempio di istruzione di questo tipo è

ADD A,05h

che somma ad A il valore 05h e mette nuovamente il risultato in A.

Indirizzamento immediato esteso (a 16 bit)

Nel modo immediato esteso l'operando, costituito da 16 bit suddivisi in 2 byte, è posto immediatamente dopo il codice di istruzione, analogamente al caso precedente. Vedi esempio seguente:

LD HL, 1A57h

In questo caso il valore a 16 bit 1A57h viene caricato nella coppia di registri HL. L'operando è dunque costituito da 2 byte che seguono immediatamente il codice operativo dell'istruzione.

E' interessante notare che nello Z80 i due byte vengono "invertiti", cioè prima viene specificato il byte basso (low, quello meno significativo) e poi quello alto (high, quello più significativo), in questo modo:

21 57 1Ah

dove 21 è il codice operativo e gli altri due byte sono l'operando (in ordine inverso).

Il processore, per eseguire questa istruzione, leggerà i due byte che seguono il codice operativo, trasferendoli rispettivamente nelle parti L e H del registro accoppiato HL. Anche qui si utilizza semplicemente il registro PC (Program Counter) per indirizzare i due byte, uno dopo l’altro.

Un altro esempio di istruzione di questo tipo è

JP 0100h

che salta (jump) all'indirizzo in memoria specificato.


Indirizzamento indiretto

In questo caso l'operando non rappresenta un dato, ma un indirizzo in memoria. Il dato da utilizzare si trova all'indirizzo indicato. Per esempio:

LD (E000h),A

Si notino le parentesi usate nel linguaggio assembly per indicare che E000h non rappresenta il dato da caricare in A, ma l'indirizzo in memoria in cui il dato si trova.

Il codice macchina della precedente istruzione è

32 00 E0h

dove 32 è il codice operativo e gli altri due byte rappresentano l'indirizzo (con la solita inversione fra i byte alto e basso). Il processore utilizzerà questo indirizzo, dopo averne ricomposto insieme le parti Low e High, per indirizzare la memoria e scrivervi il dato (un byte), che viene copiato dal registro accumulatore A.

 

Indirizzamento indiretto tramite registro accoppiato

In questo caso il contenuto di un registro accoppiato a 16 bit (BC, DE o HL) specificato nel codice di istruzione, viene usato come indirizzo della locazione di memoria che contiene l’operando. Questo modo si chiama così poiché, per reperire l'indirizzo dell'operando, il processore esegue un passaggio intermedio: la consultazione di un registro interno. Esempio:

LD C,(HL)

In questo esempio, nel registro C viene trasferito il byte di memoria il cui indirizzo si trova nel registro accoppiato a 16 bit HL. Naturalmente è necessario avere precedentemente inizializzato tale registro al valore desiderato.

In questo caso il codice dell'istruzione è costituito dal solo codice operativo (4Eh), poiché in effetti non deve essere specificato il valore di nessun operando. Si noti la compattezza del codice prodotto: un solo byte. Tutto ciò che serve è contenuto nel byte di codice operativo senza bisogno di ulteriori specificazioni (salvo il contenuto del registro HL). Questo modo di indirizzamento è conveniente quando si deve accedere molte volte alla stessa locazione e quando l’indirizzo della locazione deve essere “calcolato", come ad esempio nel caso di tabelle di dati (vettori) gestite da indice.

 

Indirizzamento indiretto tramite registro indice

Questo modo è simile al precedente, ma più complesso. In questo caso l'indirizzo del byte di memoria da scrivere o leggere è calcolato sommando al contenuto di uno degli appositi Registri Indice IX o IY il valore contenuto nel byte che segue il codice operativo dell’istruzione. Quest'ultimo numero è chiamato offset o dislocazione (displacement), una costante che può essere sia positiva che negativa, ma compresa nell’intervallo da -128 a +127. Esempio:

LD B,(IY+2Fh)

L'istruzione di questo esempio trasferisce nel registro B il contenuto della locazione di memoria il cui indirizzo viene ricavato sommando al contenuto del registro IY la dislocazione 2Fh.

Il codice operativo di questa istruzione composto da due bytes (FDh e 46h), seguiti dalla dislocazione che nell'esempio vale +47 (2Fh)

FD 46 2Fh

Quando l'offset è uguale a zero, esso può generalmente essere omesso come in

LD A,(IY) che equivale a LD A,(IY+0)

   

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it