Testo di rif.to: [Congiu] 4.3 (pg. 138 148) 02.b Metodi di indirizzamento Indirizzamento immediato Indirizzamento di registro Indirizzamenti in memoria Metodi di indirizzamento 1 Gli indirizzi degli operandi sono collocati in appositi campi (gruppi di bit) delle istruzioni. 1 Esempio: Il modo di considerare il contenuto del campo INDIRIZZO determina il particolare metodo di indirizzamento.
Metodi di indirizzamento 2 In genere il primo word (operation word) di ciascuna istruzione contiene, oltre alla codifica dell operazione da eseguire, le informazioni relative ai metodi di indirizzamento da utilizzare per accedere agli operandi. 2 Alcuni di questi metodi richiedono ulteriori informazioni che vengono memorizzate in uno o più word aggiuntivi (extension word). Metodi di indirizzamento nel PD32 Nel PD32 le istruzioni hanno un operation long-word (OL) di 32 bit. Alcuni metodi di indirizzamento richiedono informazioni contenute in un extension long-word (EL) di 32 bit. Ogni indirizzo (IND1, IND2) è specificato da due campi: M (da 3 bit) che individua il modo di indirizzamento, R (da 3 bit) che individua l eventuale registro usato. 3 Codifica dei modi di indirizzamento nelle istruzioni del PD32
Metodi di indirizzamento usati Indirizzamento immediato Assoluto diretto Assoluto indiretto in blu i metodi non presenti nel PD32 (attribuibili al PD132) Diretto di registro Indiretto con registro Auto-incrementante (diretto e indiretto) Auto-decrementante (diretto e indiretto) Con registro indice Indiretto con registro indice Con registro base Auto-relativo (diretto e indiretto) 4 Indirizzamento immediato 5 MOVL #28, R0 ; 28 R0 Nel PD32 l indirizzamento immediato è individuato dal valore 1 nel campo M. Il campo R non è usato. L operando immediato è contenuto in un EL di 32 bit. Il suo valore è compreso tra -2 31 e 2 31-1. Per accedere all operando il processore deve eseguire il fetch di questo EL. Numero accessi alla memoria: fetch(ol) +fetch(el) +0 fetch(ol) + 1 = 2
Indirizzamento assoluto ADDL 132, R0 ; L[132] + R0 R0 6 Nel PD32 l indirizzamento assoluto corrisponde al valore 2 nel campo M. Il campo R non è usato. L indirizzo assoluto è contenuto in un EL di 32 bit. Consente perciò di accedere a 2 32 = 4 GB di memoria. Per accedere all operando il processore, dopo aver effettuato il fetch dell EL, con cui ottiene l indirizzo dell operando, deve effettuare un ulteriore accesso alla memoria (al valore dell operando). Numero accessi alla memoria: fetch(ol) +fetch(el) +1 fetch(ol) + 2 = 3 Indirizzamento assoluto indiretto (PD132) ADDL @456, R0 ; L[L[456]] + R0 R0 Nel PD132 l indirizzo del puntatore è contenuto in un EL di 32 bit, con cui si possono individuare 2 30 = 1 G puntatori (da 4 byte) situati in memoria. Ciascun puntatore può accedere a 2 32 = 4 GB. Per accedere all operando il processore, dopo aver effettuato il fetch dell EL, con cui ottiene l indirizzo di un puntatore all operando, deve effettuare due ulteriori accessi alla memoria: il primo per leggere il puntatore all operando, il secondo per accedere al valore dell operando Numero accessi alla memoria: fetch(ol) +fetch(el) + 2 fetch(ol) + 3 = 4 7
Confronto tra i tre metodi presentati 8 Confronto tra i 3 diversi modi di indirizzamento Indirizzamento diretto di registro ADDL R0, R1 ; R0 + R1 R1 9 Nel PD32 l indirizzamento diretto di registro corrisponde al valore 0 nel campo M. Il campo R specifica il registro in cui si trova l operando. Per accedere all operando non sono necessari accessi alla memoria. Numero accessi alla memoria: fetch(ol) + 0 fetch(ol) + 0 = 1
Indirizzamento indiretto con registro ADDL (R0), R1 ; L[R0] + R1 R1 Nel PD32 l indirizzamento indiretto con registro corrisponde al valore 3 nel campo M. 10 Il campo R specifica il registro in cui si trova un puntatore all operando. Per accedere all operando è necessario un accesso alla memoria (all indirizzo contenuto nel registro specificato). Numero accessi alla memoria: fetch(ol) + 1 fetch(ol) + 1 = 2 Indirizzamento auto-incrementante ADDz (R0)+, R1 ; M[R0] + R1 R1 ; R0 + d R0 Nel PD32 questo indirizzamento è individuato dal valore 7 nel campo M. Il campo R specifica il registro in cui si trova un puntatore all operando (è un indirizzamento indiretto con registro). Dopo l accesso all operando, il puntatore viene incrementato di una quantità d pari alla lunghezza (in byte) dell operando stesso (d = 1 per B, 2 per W, 4 per L). Per accedere all operando è necessario un accesso alla memoria (all indirizzo contenuto nel registro specificato). Numero accessi alla memoria: fetch(ol) + 1 fetch(ol) + 1 = 2 11
Indirizzamento auto-decrementante ADDz -(R0), R1 ; R0 - d R0 ; M[R0] + R1 R1 Nel PD32 questo indirizzamento è individuato dal valore 6 nel campo M. Il campo R specifica il registro in cui si trova un puntatore all operando (è un indirizzamento indiretto con registro). Prima di accedere all operando, il puntatore viene decrementato di una quantità d pari alla lunghezza (in byte) dell operando stesso (d = 1 per B, 2 per W, 4 per L). Per accedere all operando è necessario un accesso alla memoria (all indirizzo contenuto nel registro specificato). Numero accessi alla memoria: fetch(ol) + 1 fetch(ol) + 1 = 2 12 Utilità dell auto auto-in(de) in(de)cremento Consente di percorrere liste di dati consecutivi (in avanti o a ritroso). 13 Consente di realizzare gli accessi LIFO ad uno stack: MOVW 1000, -(R7) MOVW (R7)+, R0 ; W[1000] push ; pop RO ; (R7 funge da stack pointer)
Indirizzamento autoinc.. indiretto (PD132) 14 ADDW @(R0)+, R1 ; W[L[R0]] + R1 W R1 W ; R0 + 4 R0 Questo metodo non esiste nel PD32. Il dato puntato dal registro specificato è un puntatore (un indirizzo, lungo 4 byte), perciò l incremento è di 4. Dopo il fetch, il primo accesso alla memoria ottiene un puntatore all operando; un secondo accesso è necessario per ottenere il valore dell operando. Numero accessi alla memoria: fetch(ol) + 2 fetch(ol) + 2 = 3 Indirizzamento autodec.. indiretto (PD132) 15 ADDB @-(R0), R1 ; R0-4 R0 ; B[L[R0]] + R1 B R1 B Questo metodo non esiste nel PD32. Il dato puntato dal registro specificato è un puntatore (un indirizzo, lungo 4 byte), perciò l incremento è di 4. Dopo il fetch, il primo accesso alla memoria ottiene un puntatore all operando; un secondo accesso è necessario per ottenere il valore dell operando. Numero accessi alla memoria: fetch(ol) + 2 fetch(ol) + 2 = 3
Indirizzamento con registro indice - 1 16 E un metodo di indirizzamento a due componenti: MOVL X(R1), R2 ; L[X+R1] R2 X: indirizzo base R1: registro indice (contiene l offset) Nel PD32 questo metodo di indirizzamento è individuato dal valore 4 nel campo M. Il registro che funge da registro indice è specificato nel campo R. Indirizzamento con registro indice - 2 17 L indirizzo base X è contenuto in un EL. Per accedere all operando il processore, dopo aver effettuato il fetch dell EL, con cui ottiene l indirizzo base, lo somma all offset contenuto nel registro indice, per calcolare l indirizzo dell operando; effettua poi un ulteriore accesso alla memoria (al valore dell operando). Numero accessi alla memoria: fetch(ol) +fetch(el) +1 fetch(ol) + 2 = 3 Codifica, nel PD32, dell indirizzamento con registro indice
Indirizzamento con registro indice - 3 18 ESEMPIO DI USO DI UN REGISTRO INDICE: short[] A, B, C; //array di short (2 byte) for (int i=0; i<100 ; i++) A[i]=B[i]+C[i]; 102 Organizzazione in memoria dei tre array A,B,C Indirizzamento con registro indice - 4 La somma dei due array può essere effettuata mediante le seguenti istruzioni: 19 MOVW 300(R1), R0 ;B[R1] R0 (B[i]) ADDW 500(R1), R0 ;C[R1] + R0 R0 (B[i]+C[i]) MOVW R0, 100(R1) ;R0 A[R1] (A[i]) eseguite iterativamente 100 volte, con il registro R1 contenente il valore 0 la prima volta e incrementando questo valore di 2 unità ad ogni iterazione.
Indirizzamento con registro indice - 5 Organizzazione del ciclo iterativo che calcola la somma dei due array: 20 MOVB #100, R2 ; valore iniziale del contatore MOVL #0, R1 ; e del registro indice LOOP: MOVW 300(R1), R0 ADDW 500(R1), R0 MOVW R0, 100(R1) ADDL #2, R1 ; incremento del registro indice SUBB #1, R2 ; decremento del contatore JNZ LOOP ; criterio di fine iterazioni.. ; istruzione successiva Indirizzamento indiretto con RI (PD132) Forma pre-indexed: il registro indice RI viene usato prima di effettuare l indirizzamento indiretto: in tal modo il longword situato all indirizzo X+RI viene interpretato come un puntatore all operando. L operando è M[L[X + RI]] Forma post-indexed: il registro indice RI viene usato dopo aver considerato l indirizzo base X in modo indiretto: l indirizzo dell operando si ottiene sommando il contenuto del registro indice al contenuto del longword di memoria situato all indirizzo base. L operando è M[L[X] + RI] 21
Confronto tra pre e post-indexed (PD132) 22 Indirizzamento con registro base (PD132) L indirizzo viene calcolato come somma del contenuto di un registro RB (il registro base) e di un offset D fornito dall istruzione. L operando è M[RB + D]. Alcune macchine ammettono sia l indirizzamento con registro base sia quello con registro indice. In tal caso l indirizzo dell operando è dato dalla somma di tre componenti: RB (che contiene l indirizzo base), X (che contiene un offset, specificato nella istruzione), RI (che contiene un indice). L operando è M[RB + X + RI] 23
Indirizzamento autorelativo E anch esso un metodo di indirizzamento a due componenti. L indirizzo dell operando è dato dalla somma del contenuto del program counter PC e di un offset D. Nel PD32 l indirizzamento auto-relativo è individuato dal valore 5 nel campo M. Il campo R non è usato e l offset D è contenuto in un EL. L operando è M[PC + D]. Il valore del PC che interviene nella somma è quello che punta al (primo) EL dell istruzione. Nel caso di indirizzamento auto-relativo indiretto (PD132) la somma D + PC individua non l operando ma un puntatore ad esso. 02.b Fine Metodi di indirizzamento