Un altro tipo di indirizzamento • Tipi di indirizzamento visti finora – Indirizzamento di un registro – Indirizzamento con registro base in memoria L’insieme delle istruzioni (3) • Ponendo lo spiazzamento a zero, è possibile effettuare l’indirizzamento indiretto • Cosa altro è necessario? – Possibilità di specificare costanti, ad esempio da usare nelle istruzioni aritmetiche o nelle istruzioni di salto Architetture dei Calcolatori • Indirizzamento immediato (lettere A-I) – Vogliamo avere istruzioni del tipo • Somma la costante 4 al registro $t1 • Setta il registro $t1 se il valore del registro $s0 è minore di 12 Architetture dei Calcolatori 2004/05 Valeria Cardellini Istruzioni di somma e scelta con operando • Istruzione addi (add immediate) – Codice MIPS: addi $t0, $t1, 4 • Istruzione slti (set on less than immediate) 8 – slti $t0, $s0, 12 – Se il valore del registro $s0 è minore di 12 allora pone a 1 il registro $t0, altrimenti pone a 0 il registro $t0 rt 6 bit 5 bit 5 bit 8 4 – Codice MIPS: slti $t0, $s0, 12 10 address 16 bit 16 8 12 • Anche le istruzioni andi e ori seguono il formato di tipo I – La costante è contenuta nel campo address (16 bit) Architetture dei Calcolatori 2004/05 Valeria Cardellini 9 • Formato istruzione slti • Formato delle istruzioni addi e slti – Seguono il formato di istruzione di tipo I (immediate), usato anche dalle istruzioni lw e sw rs Istruz. di somma e scelta con operando (2) • Formato istruzione addi – addi $t1, $t1, 4 – Somma la costante 4 al valore contenuto in $t1 e pone il risultato in $t1 op 1 – Istruzioni per utilizzare un valore costante nell’operazione di AND e OR 2 Architetture dei Calcolatori 2004/05 Valeria Cardellini 3 1 Dimensione delle costanti Istruzione lui • Le istruzioni di tipo I consentono di rappresentare nel campo address costanti esprimibili in 16 bit (valore massimo 65535 unsigned) • I valori immediati sono rappresentati in assembler secondo la rappresentazione decimale, ma possono anche essere esadecimali o binari • Un problema: come fare se 16 bit non sono sufficienti a rappresentare una costante? • Istruzione lui (load upper immediate) – lui rt, imm – Carica i 16 bit del valore imm nei 16 bit più significativi del registro rt; i rimanenti 16 bit del registro rt sono posti a 0 – Segue il formato di istruzione di tipo I • Codice MIPS: lui $t2, 127 – Osservazione: nella pratica le costanti sono piccole – Esiste una soluzione costosa in due passi per i casi meno frequenti 15 10 Carica la costante 127 nei 16 bit più significativi del registro $t2 registro $t2 0000000001111111 0000000000000000 16 15 31 4 0 Architetture dei Calcolatori 2004/05 Valeria Cardellini 5 Caricamento di costanti a 32 bit Esercizi • Supponiamo di voler caricare il valore 400000010 nel registro $s0 • Scrivere un programma in assembler MIPS che, dato l’array di interi A di 100 elementi, effettua la somma solamente degli elementi di A minori di 10 – In binario 0000 0000 0011 1101 0000 1001 0000 0000 sum = 0; • Separiamo il valore in binario in 2 valori a 16 bit for (i=0; i<100; i++) – Il valore 6110 per i 16 bit più significativi In binario 0000 0000 0011 1101 – Il valore 230410 per i 16 bit meno significativi Pari a 0000 1001 0000 0000 lui $s0, 61 ori $s0, $s0, 2304 127 001111 00000 01010 0000000001111111 1) Caricare una costante (16 bit) nei 16 bit più significativi di un registro (bit 31-16) utilizzando l’istruzione lui (load upper immediate) 2) Aggiungere i 16 bit meno significativi (bit 15-0) utilizzando l’istruzione ori Architetture dei Calcolatori 2004/05 Valeria Cardellini 0 if (A[i] < 10) sum = sum + A[i]; • Scrivere un programma in assembler MIPS che, dato l’array di interi A di 100 elementi, effettua la somma solamente degli elementi di A minori di 10 e maggiori di 5 # 0000 0000 0011 1101 nei bit 31-16 di $s0 # 0000 1001 0000 0000 nei bit 15-0 di $s0 sum = 0; for (i=0; i<100; i++) if ((A[i] > 5) && (A[i] < 10)) sum = sum + A[i]; Architetture dei Calcolatori 2004/05 Valeria Cardellini 6 Architetture dei Calcolatori 2004/05 Valeria Cardellini 7 2 Indirizzamento nei salti Istruzioni di salto incondizionato (tipo J) • Conosciamo diverse istruzioni che permettono di eseguire salti • Il campo address del formato J è di 26 bit – Una parte (26 bit su 32) dell’indirizzo assoluto di destinazione del salto – Il registro Program Counter (PC), che nel MIPS contiene l’indirizzo della prossima istruzione da eseguire, è grande 32 bit – Ma l’istruzione di tipo J ha un campo di 26 bit e dovrebbe indirizzare tutta la memoria – Istruzioni di salto condizionato (beq, bne) – Istruzioni di salto incondizionato (j) • Queste istruzioni hanno formati diversi – Formato I per beq e bne op rs 6 bit 5 bit – Formato J per j rt • Si adotta l’indirizzamento pseudo-diretto; in effetti si usano due tecniche: address 5 bit 16 bit op address 6 bit 26 bit – Indirizzamento alla parola – Concatenazione Architetture dei Calcolatori 2004/05 Valeria Cardellini 8 Istruzioni di salto incondizionato (2) Architetture dei Calcolatori 2004/05 Valeria Cardellini Esempio di indirizzamento per tipo J • Indirizzamento alla parola – L’indirizzo nel formato J indirizza le parole (word): quindi l’indirizzo a cui saltare si ottiene moltiplicando per 4 il valore memorizzato nei 26 bit – La moltiplicazione per 4 equivale a far scorrere la parola di 2 bit a sinistra • E’ come se si esprimesse un indirizzo (a byte) di 28 bit • Per l’istruzione di formato J j 10000 – L’indirizzo 10000 si riferisce al byte – Si memorizza l’indirizzo alla parola (ossia 10000/4 = 2500) 2 • Concatenazione – I restanti 4 bit vengono presi dai 4 bit più significativi del PC (lasciandoli quindi inalterati) 000010 • Quindi, l’istruzione j rimpiazza solo i 28 bit più significativi del PC, lasciando inalterati i rimanenti 4 bit più significativi – Sono possibili programmi di dimensione pari a 228 = 28·220 = 256 MB – Per saltare ad indirizzi maggiori di 256 MB: usare l’istruzione jr che compie un salto a indirizzo di 32 bit (spazio di 232 byte ovvero 230 word) Architetture dei Calcolatori 2004/05 Valeria Cardellini 9 10 2500 00000000000000100111000100 00000000000000100111000100 … 0000000000000010011100010000 PC31PC30PC29PC280000000000000010011100010000 Dal PC Architetture dei Calcolatori 2004/05 Valeria Cardellini 26 bit 28 bit 32 bit 11 3 Esempio di indirizzamento per tipo I Istruzioni di salto condizionato (tipo I) • Per l’istruzione di formato I 1000 bne $t0, $t1, L1 • Il campo address del formato I è di 16 bit – Usando le stesse tecniche viste per il formato J non potremmo saltare ad indirizzi più grandi di 218 – – – – – – • Usando l’indirizzamento alla parola (da 16 a 18 bit) e la concatenazione con i 14 bit più significativi di PC – I programmi non potrebbero essere più grandi di 218 = 28·210 = 256 KB: non è accettabile! • Si adotta l’indirizzamento relativo al Program Counter 000101 01000 01001 – Il valore dei 16 bit è usato come un valore relativo alla posizione corrente 39610 0000000000000000000000000110001100 + – Viene sommato il valore del campo address al valore del registro PC PC = 100410 0000000000000000000000001111101100 12 Architetture dei Calcolatori 2004/05 Valeria Cardellini 13 Esempio Istruzioni di salto condizionato (2) • Codice C • La tecnica di indirizzamento utilizzata per il salto condizionato limita i salti a ± 215 parole (ovvero ± 217 byte) • In pratica non è una grande limitazione i += 1; Loop: # $t1 = i * 4 add $t1, $t1, $s6 # $ti = indirizzo di A[i] bne $t0, $s5, Exit addi $s3, $s3, 1 #i=i+1 j Loop – Esempio: l’assemblatore può tradurre un salto che richiede 18 bit 132072 sll $t1, $s3, 2 lw $t0, 0($t1) • Il limite è comunque superabile mediante l’uso combinato di istruzioni di branch ed una istruzione di jump Architetture dei Calcolatori 2004/05 Valeria Cardellini while (A[i] ==k) • Codice MIPS – I salti sono spesso di piccola entità – Tipicamente i branch servono nei cicli, che normalmente non sono di grandi dimensioni beq $t0, $t1, L1 0000000001100011 0000000001100011 16 bit … 000000000110001100 18 bit • L’etichetta fornisce la distanza (in numero di parole) tra l’istruzione corrente e l’istruzione da eseguire se il test ha successo (indirizzamento alla parola) Architetture dei Calcolatori 2004/05 Valeria Cardellini L’istruzione bne è memorizzata all’indirizzo 1000 Il valore corrente del PC è quindi 1004 (1000 + 4) Supponiamo che l’istruzione etichettata da L1 sia all’indirizzo 1400 Quale è il valore dell’etichetta L1 nel formato I? Occorre saltare di 99 parole, essendo (1400 – 1004)/4 = 99 Si memorizza il numero 99 nei 16 bit Exit: bne $t0, $t1, L2 • Assumiamo che la prima istruzione sia memorizzata alla locazione di indirizzo 80000 j L1 L2: … 14 Architetture dei Calcolatori 2004/05 Valeria Cardellini 15 4 Modalità di indirizzamento: riepilogo Esempio (2) • MIPS ha solo 5 modalità di indirizzamento • Codice in linguaggio macchina 80000 0 0 19 9 2 0 80004 0 9 22 9 0 32 80008 35 9 8 0 80012 5 8 21 2 80016 8 19 19 1 80020 2 – A registro (register addressing) – Immediato (immediate addressing) – Con registro base o spiazzamento (base or displacement addressing) – Relativo al Program Counter (PC-relative addressing) – Pseudo-diretto (pseudodirect addressing) • Una singola istruzione può usare più di un indirizzamento • Modalità di indirizzamento semplificate rispetto ad altre architetture 20000 80024 Architetture dei Calcolatori 2004/05 Valeria Cardellini 16 Indirizzamento a registro rs rt rd • L’operando è una costante, il cui valore è contenuto nell’istruzione • L’indirizzamento immediato si usa per specificare il valore di un operando sorgente, non ha senso usarlo come destinazione shamt funct op register • Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo R (esempio: istruzioni logicoaritmetiche) Architetture dei Calcolatori 2004/05 Valeria Cardellini 17 Indirizzamento immediato • L’operando è il contenuto di un registro della CPU: il nome del registro è specificato nell’istruzione op Architetture dei Calcolatori 2004/05 Valeria Cardellini rs rt operando • Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo I – La costante è memorizzata nel campo a 16 bit – Esempio: istruzione logico-aritmetica con operando immediato, operazione di confronto con operando immediato 18 Architetture dei Calcolatori 2004/05 Valeria Cardellini 19 5 Indirizzamento con base Indirizzamento relativo al PC • L’operando è in una locazione di memoria, il cui indirizzo si ottiene sommando il contenuto di un registro base ad un valore costante (offset o spiazzamento) contenuto nell’istruzione • L’operando (istruzione) è in una locazione di memoria, il cui indirizzo si ottiene sommando il contenuto del Program Counter ad un valore costante (offset o spiazzamento) contenuto nell’istruzione op op rs rt offset rs rt offset + + indirizzo registro indirizzo PC parola • Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo I • Esempio: istruzioni di load/store memoria Architetture dei Calcolatori 2004/05 Valeria Cardellini 20 – Diretto o assoluto (direct) • • • • offset | – Esempio: istruzioni di salto incondizionato Architetture dei Calcolatori 2004/05 Valeria Cardellini 21 • Esistono anche altre modalità di indirizzamento in memoria usate in architetture diverse da MIPS (ad es. Intel 80x86) • Tali modalità consentono ad esempio di avere gli operandi in memoria. Esempio: • Una parte dell’indirizzo è presente come valore costante (offset o spiazzamento) nell’istruzione ma deve essere completato • L’indirizzo di salto si ottiene facendo uno shift a sinistra di 2 bit dei 26 bit di offset contenuti nell’istruzione e concatenando i 28 bit con i 4 bit più significativi del PC indirizzo PC • Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo J memoria Architetture dei Calcolatori 2004/05 Valeria Cardellini Altre modalità di indirizzamento Indirizzamento pseudo-diretto op • Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo I • Esempio: istruzioni di salto condizionato parola L’indirizzo di memoria assoluto è indicato direttamente nell’istruzione Istruzione di esempio: add R1, (1001) Significato: Reg[R1] ← Reg[R1] + Mem[1001] L’indirizzamento diretto si può simulare anche nel MIPS mediante l’indirizzamento con base ed usando $zero come base register (range di memoria limitato) – Indiretto con registro (register indirect) parola memoria 22 • • • • L’indirizzo di memoria è in un registro Istruzione di esempio: add R4, (R1) Significato: Reg[R4] ← Reg[R4] + Mem[Reg[R1]] L’indirizzamento indiretto si può simulare anche nel MIPS mediante l’indirizzamento con base ed usando 0 come displacement Architetture dei Calcolatori 2004/05 Valeria Cardellini 23 6 Altre modalità di indirizzamento (2) Pseudoistruzioni – Indiciato (indexed) • Il linguaggio assembler rappresenta una “interfaccia” verso il software di livello più alto • L’indirizzo di memoria è dato dalla somma di due registri • Istruzione di esempio: add R3, (R1+R2) • Significato: Reg[R3] ← Reg[R3] + Mem[Reg[R1]+Reg[R2]] • Per semplificare la programmazione, è possibile che siano aggiunte un insieme di pseudoistruzioni – Memoria indiretto (memory indirect) • L’indirizzo di memoria è dato dal contenuto di una locazione di memoria indicata da un registro • Istruzione di esempio: add R1, @(R3) • Significato: Reg[R1] ← Reg[R1] + Mem[Mem[Reg[R3]] • Le pseudoistruzioni sono un modo compatto ed intuitivo per specificare un insieme di istruzioni – Non hanno una corrispondenza uno-a-uno con le istruzioni presenti nel linguaggio macchina – Non sono implementate in hardware – Ma sono abbastanza semplici da tradurre in linguaggio macchina e rappresentano un aiuto per il programmatore, in quanto arricchiscono il set di istruzioni assembler – Scalato (scaled) • • • • L’indirizzo di memoria è dato da: offset + base + (d·indice) Istruzione di esempio: add R1, 100(R2)[R3] Significato: Reg[R1] ← Reg[R1] + Mem[100+[Reg[R2]+d·[Reg[R3]] In Intel 80386 e successivi processori 80x86: d=2s (s=0,1,2,3) • La traduzione della pseudoistruzione nelle istruzioni equivalenti è attuata automaticamente dall’assemblatore Architetture dei Calcolatori 2004/05 Valeria Cardellini 24 Architetture dei Calcolatori 2004/05 Valeria Cardellini 25 Le pseudoistruzioni MIPS Le pseudoistruzioni MIPS (2) • La pseudoistruzione move permette di copiare il valore di un registro in un altro registro • Le istruzioni di branch con slt possono essere complesse • L’assembler MIPS mette a disposizione alcune pseudoistruzioni di branch che vengono aggiunte a beq e bne • Serve un registro riservato per l’assemblatore ($at) • Esempio: la pseudoistruzione blt (branch-on-less-than) viene implementata con slt e bne – move $t0, $t1 • Il registro $t0 prende il valore del registro $t1 • Come viene tradotta move in istruzioni MIPS? – Ricordiamo che il registro $zero è mantenuto sempre a zero – move $t0, $t1 viene quindi tradotta in add $t0, $zero, $t1 • Si possono caricare costanti a 32 bit in un registro tramite la pseudoistruzione li (load immediate) blt $t0, $t1, 1000 – Vengono tradotte usando le istruzioni lui e ori • Esistono anche • E’ possibile specificare anche costanti in base esadecimale Architetture dei Calcolatori 2004/05 Valeria Cardellini – – – – 26 slt $at, $t0, $t1 bne $at, $zero, 1000 bgt (branch-on-greater-than) bge (branch-on-greater-than-or-equal) ble (branch-on-less-than-or-equal) Per esercizio, determinare come sono implementate in MIPS Architetture dei Calcolatori 2004/05 Valeria Cardellini 27 7