Architettura degli Elaboratori II (canale P-Z) Modi di Indirizzamento Dott. Franco Liberati Argomenti Assoluto Immediato A Registro Incremento Modi di indirizzamento Un modo di indirizzamento è un modo per esprimere un indirizzo di memoria NB: alla fine il risultato è sempre un indirizzo di memoria dove si andrà a leggere (load) o scrivere (store) un dato. La struttura è Nel linguaggio macchina MIPS, esiste un solo modo di indirizzamento imm(register) dove l’indirizzo è dato dalla somma del valore immediato imm più il contenuto del registro register OPCODE MODO DI INDIRIZZAMENTO Esempio: lw $t0, 4($sp) (legge una word dall’indirizzo $sp + 4) Modi di Indirizzamento in SPIM Modi di indirizzamento L’assembler fornisce per comodità più modi di indirizzamento Un indirizzo si può esprimere come somma di: una etichetta + una espressione + un registro Esempio: lw $t1, array + 0x100($t0) (mette nel registro $t1, la word sita all’indirizzo 0x10010104 assumendo: array = 0x10010000 e $t0 = 4) A REGISTRO (base register) Specifica un indirizzo tramite registro base, assumendo un offset 0. L’indirizzo è dato dal contenuto del base register Esempio: lb $t0,($a0) A REGISTRO lb $t0,($a0) 10001101 00000010 $t0 00000010 IMMEDIATO (expression) Specifica un indirizzo assoluto con una espressione L'indirizzo è dato dal valore presente nel campo indirizzo. Esempio: lb $t0, 0x00 40 00 00 IMMEDIATO lb $t0, 0x00 00 00 8D 10001101 … 00000010 $t0 00000010 IMMEDIATO con spiazzamento expression Specifica un indirizzo assoluto con una espressione fatta solo di somme e sottrazioni di costanti espresse in decimale o esadecimale. L'indirizzo è dato dal risultato dell'espressione (costante). Esempio: lb $t0, 0x00 40 00 00+4 I numeri negativi vanno comunque preceduti anche dal simbolo +. Esempio: lb $t0, 0x10 01 00 0c + -4 IMMEDIATO con spiazzamento lb $t0, 0x00 00 00 8D + 4 10001101 + 100 $t0 00000010 00000010 … 10010000 10010001 10010010 10010011 … IMMEDIATO A REGISTRO expression(base register) Specifica un indirizzo tramite registro base e un offset tramite una espressione L'indirizzo è dato dal contenuto del base register + il risultato dell'espressione Esempio: lw $t0, 4($sp) IMMEDIATO A REGISTRO Esempio: lw $t0, 4($sp) 10001101 10001101 + 100 $t0 00000010 00000010 $sp … 10010000 10010001 10010010 10010011 … SIMBOLICO Relocatable-symbol Specifica un indirizzo (rilocabile) tramite una etichetta. L'assemblatore genera le istruzioni necessarie per gestire l'etichetta e aggiunge al modulo oggetto generato le informazioni di rilocazione. Esempio: lw $t0, operandA SIMBOLICO Esempio: lw $t0, operandA operanA=10010001 00000010 $t0 00000010 … 10010000 10010001 10010010 10010011 … SIMBOLICO con spiazzamento Relocatable-symbol ± expression Specifica un indirizzo base tramite una etichetta, mentre l’offset viene specificato tramite un’espressione L’indirizzo è dato dalla somma dell’indirizzo associato all’etichetta con il risultato dell’espressione Esempio: lw $t0, operandoB + 4 SIMBOLICO con spiazzamento Esempio: lw $t0, operandB+4 operandoB=10001101 + 100 $t0 00000010 00000010 … 10010000 10010001 10010010 10010011 … SIMBOLICO con spiazzamento a registro Relocatable-symbol(index register) Specifica un indirizzo base tramite una etichetta, mentre l’offset viene specificato tramite un registro indice L’indirizzo è dato dalla somma dell’indirizzo associato all’etichetta con il contenuto del registro indice. Esempio: lw $t0, array($t1) SIMBOLICO con spiazzamento a registro Esempio: lw $t0, array($t1) array=10001100 + 00000101 $t1 00000101 $t0 00000010 00000010 … 10010000 10010001 10010010 10010011 … SIMBOLICO con spiazzamento a a spiazzamento a registro Relocatable-symbol ± expression(index register) Specifica un indirizzo base tramite una etichetta, mentre l’offset viene specificato tramite un registro indice e un’espressione L’indirizzo è dato dalla somma dell’indirizzo associato all’etichetta con il contenuto del registro indice e il risultato dell'espressione. Esempio: lw $t0, array + 4($t1) SIMBOLICO con spiazzamento a a spaziamento a registro Esempio: lw $t0, array+4($t1) array=10001100 + + 00000100 00000001 $t1 00000001 $t0 00000010 00000010 … 10010000 10010001 10010010 10010011 …