*   Documento PDF

La modalità di indirizzamento dei dati è la tecnica con cui, all’interno di un’istruzione si individua l’operando su cui l’istruzione stessa deve agire

Lo Z80 possiede dieci modi diversi di indirizzamento dei dati.

*   Immediato. In questo caso il dato da elaborare è espresso già all’interno dell’istruzione. Ad esempio, nell’istruzione ADD A, 20h il dato da sommare all’accumulatore è il numero 20h che è già espresso all’interno dell’istruzione

*   Immediato esteso. E’ il caso simile al precedente in cui il dato si compone di due byte. Ad esempio LD HL, 3125h

*   Con registri. In questo caso il dato è contenuto in un registro del microprocessore. Ad esempio ADD A; B: il dato da sommare all’accumulatore è contenuto nel registro B.

*   Implicito. L’operando è implicito, cioè non espresso. Ad esempio, nell’istruzione CPL che complementa l’accumulatore è implicito che l’operando sia l’accumulatore stesso.

*   Diretto o assoluto o esteso. L’operando è un dato contenuto in una locazione di memoria il cui indirizzo è espresso direttamente nell’istruzione. Ad esempio LD A, (452Fh): in questo caso l’operando è contenuto nella locazione di memoria di indirizzo 452Fh , indirizzo che appare nell’istruzione.

*   Indiretto. L’operando è un dato contenuto in una locazione di memoria il cui indirizzo è contenuto in un registro a 16 bit detto anche puntatore. Per lo Z80 questo registro è HL anche se per un’istruzione di load che coinvolga l’accumulatore si possono usare come puntatori anche i registri BC e DE. Ad esempio, ADD A, (HL). Per eseguire quest’operazione il microprocessore deve leggere il contenuto del registro HL, accedere in memoria a questo indirizzo, prelevare il contenuto della locazione così individuata e sommarlo all’accumulatore.

 

 

 

 

 

 

 

*   Indicizzato. In questo caso l’operando è un dato contenuto in una locazione di memoria. L’indirizzo di questa locazione si ottiene sommando il contenuto di un registro indice (IX o IY) con uno spiazzamento, cioè un numero a otto bit (che può valere, quindi, tra –128 a +127) espresso direttamente nell’istruzione.

Es. LD A, (IX+2)

 

 

 

 

 

 

 

Facciamo un esempio per mostrare l’utilità di questo tipo di indirizzamento. Supponiamo di voler scrivere un segmento di programma il cui scopo sia di manipolare un’area di memoria di cento dati, sostituendo ogni dato con la somma dei dati contenuti nelle due locazioni che lo seguono. Proviamo a scrivere questo segmento di programma senza utilizzare l’indirizzamento indicizzato.

LD B, 64H

;64H = 10010 è il numero delle locazioni su cui volgiamo operare, B funge dunque da contatore

LD HL, 1A00H

; supponiamo che 1A00H sia l’indirizzo della prima locazione del blocco su cui volgiamo operare

ET: INC HL

;la prima locazione da sommare si trova dopo la locazione corrente

LD A, (HL)

INC HL

;la seconda locazione si trova ancora un indirizzo dopo

ADD A, (HL)

DEC HL

DEC HL

;ora devo sostituire il dato nella locazione di partenza per cui devo far retrocedere di due posizioni

LD (HL), A

INC HL

DEC B

JP NZ, ET

; controllo se ho eseguito 100 volte l’operazione

la versione con l’indirizzamento indicizzato è molto più semplice e non costringe a spostare il puntatore avanti e indietro

LD B, 64H

;64H = 10010 è il numero delle locazioni su cui volgiamo operare, B funge dunque da contatore

LD IX, 1A00H

; supponiamo che 1A00H sia l’indirizzo della prima locazione del blocco su cui volgiamo operare

        ET: LD A, (IX+1)

ADD A, (IX+2)

LD (IX), A

INC IX

DEC B

JP NZ, ET

*   Relativo. Si usa nelle istruzioni di salto relativo, in cui la locazione cui saltare si ottiene sommando al contenuto del Program Counter uno spiazzamento costituito da un byte (che può assumere un valore compreso fra –128 e +127)

*   Pagina zero. Già introdotto quando abbiamo parlato delle istruzioni di restart RST. Abbiamo visto che l’indirizzo viene formato esprimendo esplicitamente soltanto la parte bassa (le ultime due cifre esadecimali) mentre la parte alta si presuppone implicitamente pari a zero.

*   A bit. Istruzioni come Bit, SET e RESET sono in grado di agire sul singolo bit di un operando. Ad esempio, RES 3, (HL) significa che si vuole resettare il bit 3 (il quarto bit) della locazione di memoria il cui indirizzo è contenuto in HL.