Il linguaggio macchina Istruzioni macchina (PH 2.4) Indirizzamento (PH 2.9) Costanti a 32-bit (PH 2.9) 1 Linguaggio macchina Le istruzioni in linguaggio assembly devono essere tradotte in linguaggio macchina (cioè in sequenze di 0 e 1) per poter essere eseguite Le istruzioni in linguaggio macchina sono lunghe 32 bit (come i istri e le parole di memoria) 2 1
Linguaggio macchina Nelle istruzioni macchina i istri sono indirizzati con numeri progressivi da 0 a 31 In MIPS: $zero -> 0 $at -> 1 (istro riservato) $v0, $v1 -> 2, 3 $a0 - $a3 -> 4-7 $t0 - $t7 -> 8-15 $s0 - $s7 -> 16-23 $t8, $t9 -> 24, 25 $k0, $k1 -> 26, 27 (istri riservati) $gp, $sp -> 28, 29 $fp, $ra -> 30, 31 3 Formato istruzioni aritmetiche Le istruzioni macchina hanno una rappresentazione binaria di 32 bit (la stessa dimensione di una parola di memoria) Una istruzione macchina (32 bits) è suddivisa in gruppi di bits detti CAMPI IL numero e la lunghezza dei campi di una istruzione determinano il FORMATO dell'istruzione Vi sono diversi formati; ad esempio, il formato tipo R delle istruzioni aritmetico-logiche è : op rs rt rd shmt func 6 bit 65 bit 5 bit 5 bit 5 bit 6 bit 4 2
Formato istruzioni aritmetiche Formato R 5 Formato istruzioni di tipo R op rs rt rd shmt func 6 bit 65 bit 5 bit 5 bit 5 bit 6 bit Ai vari campi sono stati assegnati dei nomi mnemonici: op: (opcode) identifica la classe di istruzione rs: istro contenente il primo operando sorgente rt: istro contenente il secondo operando sorgente rd: istro destinazione contenente il risultato shamt: shift amount (scorrimento) funct: indica la variante specifica dell'operazione 6 3
Istruzioni di tipo R - Esempio add $t0, $s1, $s2 0 17 18 8 0 32 000000 10001 10010 01000 00000 100000 0x 02 32 40 20 Istruzione macchina 7 Istruzioni di tipo R Le diverse istruzioni aritmetico-logiche hanno tutte un formato di tipo R, ad esempio: somma, prodotto, divisione shift (scorrimento) AND, OR, NOT Le diverse istruzioni aritmetico-logiche si distinguono tra loro in base al campo funct 8 4
Istruzioni di tipo R - Esempi 9 Formato istruzioni aritmetiche Formato I 10 5
Formato istruzioni di tipo I Il formato delle istruzioni di tipo R non è adatto a rappresentare istruzioni di load/store Alla costante (offset) delle istruzioni lw e sw sarebbe riservato un campo di 5 bit (con valore massimo 2 5 = 32) Per le istruzioni di load/store si utilizza un formato diverso ( tipo I ) utilizzando sempre 32 bit complessivi 11 Formato istruzioni di tipo I op rs rt indirizzo 6 bit 5 bit 5 bit 16 bit In questo formato, i campi hanno il seguente significato: op: (opcode) identifica il tipo di istruzione rs: indica il istro base rt: indica il istro destinazione dell'istruzione di caricamento (per ist. lw) indirizzo: riporta lo spiazzamento (offset) Con questo formato una istruzione lw (sw) può indirizzare parole nell'intervallo -2 15 +2 15-1 rispetto all'indirizzo base 12 6
Istruzioni di tipo I: esempio lw $t0, 32($s3) 35 19 8 32 100011 10011 01000 0000000000100000 13 Esempio A[300] = h + A[300] lw $t0, 1200($t1) # $t1 ind. base di A[0] add $t0, $s2, $t0 # $t2 variabile h sw $t0, 1200($t1) 35 9 8 1200 0 18 8 8 0 32 43 9 8 1200 100011 01001 01000 0000010010110000 000000 10010 01000 01000 00000 100000 101011 01001 01000 0000010010110000 0x8D2804B0 0x02484020 0xAD2804B0 14 7
Istruzioni di salto Salti condizionati relativi: beq r1, r2, Lab bne r1, r2, Lab (branch on equal) (branch on not equal) Salti incondizionati assoluti: j Lab (jump) jr r (jump ister) jal Lab (jump and link) (chiamata a procedura) 15 Istruzioni di salto Salti condizionati relativi: Il flusso sequenziale di controllo cambia solo se la condizione è vera Il calcolo del valore dell'etichetta Lab (indirizzo di destinazione del salto) è relativo al Program Counter (PC) Salti incondizionati assoluti: Il salto viene sempre eseguito L'indirizzo di destinazione del salto è un indirizzo assoluto di memoria 16 8
Formato delle Istruzioni di salto Nome beq bne j jr jal Formato I I J J J 17 Salti condizionati istruzioni tipo I op rs rt indirizzo 6 bit 5 bit 5 bit 16 bit Nel caso di salti condizionati, i campi hanno il seguente significato: op: (opcode) identifica il tipo di istruzione rs: indica il il primo istro rt: indica il secondo istro indirizzo: riporta lo spiazzamento (offset) Per l'offset si hanno a disposizione solo 16-bit del campo indirizzo - rappresentano un indirizzo relativo al PC ( PC-relative word address ) 18 9
Istruzioni di salto condizionato (tipo I) L'indirizzamento relativo al PC permette di fare dei salti condizionati a locazioni di memoria il cui indirizzo assoluto non è esprimibile con soli 16-bit Esempio: bne $s0, $s1, L1 Per esprimere l'etichetta L1 si hanno a disposizione 16-bit; il valore di L1 è calcolato rispetto al PC in modo da saltare avanti o indietro rispetto all'istruzione corrente 19 Istruzioni di salto condizionato (tipo I) I 16-bit del campo indirizzo esprimono l'offset rispetto al PC L'offset varia tra -2 15 e +2 15-1 Esempio: bne $s0, $s1, L1 l'assemblatore sostituisce l'etichetta L1 con l'indirizzo di parola relativo a PC: (L1- PC)/4 PC contiene l'indirizzo dell'istruzione successiva al salto La divisione per 4 serve per calcolare l'indirizzo di parola Il valore del campo indirizzo può essere negativo (salti all'indietro) 20 10
Esempio loo: add $t1, $s3, $s3 #....... bne $t0, $s5, exi add $s3, $s3, $s4 j loo exi: #....... $t0 -> $8 $s4 -> $20 $s3 -> $19 $s5 -> $21 80000: 0 19 19 9 0 32....... 80016: 5 8 21 2 80020:.............. 80028: exi..... 2 = (80028 80020)/4 Nota: quando si esegue la bne, PC punta già all'istruzione successiva (80020) 21 Formato istruzioni aritmetiche Formato J 22 11
Formato istruzioni di tipo J op indirizzo 6 bit 26 bit Il terzo tipo di formato istruzione (Formato J) è il formato usato per le istruzioni di salto incondizionato (jump) In questo caso, i campi hanno il seguente significato: op indica il tipo di operazione indirizzo (composto da 26-bit) riporta una parte (26 bit su 32) dell'indirizzo assoluto di destinazione del salto I 26-bit del campo indirizzo rappresentano un indirizzo di parola (word address) 23 Istruzione di salto incondizionato (tipo J) L indirizzo rappresentato dall etichetta L1 viene prima espresso su 28 bit ( i meno significativi) (byte address) e poi diviso per 4 per ottenere l indirizzo a parola (word address) (shift a destra di 2 bits) in pratica si eliminano i due 0 finali si amplia lo spazio di salto: si salta tra 0 e 2 28 byte (2 26 word) 24 12
Istruzione di salto incondizionato (tipo J) I 26-bit di indirizzo nelle jump rappresentano un indirizzo di parola (word address) corrispondono ad un indirizzo di byte (byte address) composto da 28-bit Poichè il istro PC è composto da 32-bit l'istruzione jump rimpiazza solo i 28-bit meno significativi del PC, lasciando inalterati i rimanenti 4-bit più significativi 25 Istruzioni di tipo J: esempio 8 x 4 8 26 13
Salti di dimensioni maggiori Per saltare ad indirizzi superiori a 2 28 Byte si usa l'istruzione: jr rs (jump ister con formato R) Salta all'indirizzo di memoria assoluto contenuto nel istro rs (spazio di 2 32 byte cioè 2 30 word : l intero spazio di memoria) 27 Salti condizionati di dimensioni maggiori beq $s0, $s1, L1 se L1 è molto lontano si può procedere come segue : bne $s0, $s1, L2 j L1 L2: 28 14
15 29 MIPS Instruzioni aritmetiche immediate 001001 I addiu 100101 00000 000000 R subu 100001 00000 000000 R addu immediate 001000 I addi 100100 00000 000000 R sub 100000 00000 000000 R add address/immediate funct shamt rd rt rs op formato istr 30 MIPS Instruzioni salti condizionati 101010 00000 000000 R slt immediate 001010 I slti 101011 00000 000000 R sltu immediate 001011 I sltiu address 000101 I bne address 000100 I beq address/immediate funct shamt rd rt rs op formato istr
16 31 MIPS Istruzioni logiche 100101 00000 000000 R or 000010 amt 000000 amt 101010 00000 000000 R and immediate 111100 I andi immediate 111101 I ori 00000 000000 R slr 00000 000000 R sll address/immediate funct shamt rd rt rs op formato istr 32 Modalità di indirizzamento (PH 2.9)
Modalità di indirizzamento Le modalità di indirizzamento indicano i diversi modi attraverso cui far riferimento agli operandi nelle istruzioni L'esempio più comune di modalità di indirizzamento è l indirizzamento a istro nel quale gli operandi dell'istruzione sono contenuti nei istri ad esempio add $s0, $s1, $s2 33 Modalità di indirizzamento MIPS ha solo 5 modalità di indirizzamento: A istro Immediato Con base o spiazzamento Relativo al Program Counter Pseudo-diretto diretto N.B. Una singola istruzione può usare più di una modalità di indirizzamento 34 17
Indirizzamento a istro L'operando è il contenuto di un istro della CPU: il nome del istro è specificato nell'istruzione. Indirizzamento a istro op rs rt rd funct ister Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo R Es.: istruzioni aritmetico-logiche 35 Indirizzamento immediato Indirizzamento immediato op rs rt immediate 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 Le istruzioni che usano questo tipo di indirizzamento hanno formato I : La costante è memorizzata nel campo a 16-bit 36 18
Indirizzamento immediato: esempio Es: addi $sp, $sp, 4 8 29 29 4 001000 11101 11101 0000 0000 0000 0100 37 Indirizzamento con base op rs rt offset address + memory word L'operando è in una locazione di memoria il cui indirizzo si ottiene sommando il contenuto di un istro base ad un valore costante (offset o spiazzamento) contenuto nell'istruzione Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo I 38 19
Indirizzamento con base Esempio: istruzione di load lw $t0, 32($s3) L'operando è letto in memoria all'indirizzo 32 + [$s3] Esempio: istruzione di store sw $t0, 32($s3) L'operando è scritto in memoria all'indirizzo 32 + [$s3] 39 Indirizzamento relativo al PC op rs rt offset PC + memory word L'operando è 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 Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo I 40 20
Indirizzamento relativo al PC 100/4 = 25 Esempio: Operazione di salto condizionato (formato tipo I) 41 Indirizzamento relativo al PC Si usa l'indirizzamento relativo al PC nei salti condizionati in quanto la destinazione del salto in tali istruzioni è in genere prossima al punto di salto Avendo a disposizione 16 bit di Offset: è possibile saltare in un'area tra -2 15 e +2 15-1 parole rispetto all'istruzione corrente ( 2 15 = 32768 ) : PC_new = PC_old + Offset*4 42 21
Indirizzamento pseudo-diretto Una parte dell'indirizzo è presente come valore costante (offset) nell'istruzione ma deve essere completato Le istruzioni che usano questo tipo di indirizzamento hanno formato di tipo J op PC offset PC : memory word 43 Indirizzamento pseudo-diretto op PC offset PC : memory word L'indirizzo di salto si calcola facendo uno shift a sinistra di 2 bit dei 26-bit di offset contenuti nell'istruzione (aggiungendo 00 nei bit meno significativi per passare da 26 a 28-bit) e concatenando i 28-bit con i 4-bit più significativi del Program Counter 44 22
Indirizzamento pseudo-diretto 32/4 = 8 Esempio: operazione di salto incondizionato (formato J) 45 I 5 modi di indizzamento 1. Immediate addressing op rs rt immediate 2. Register addressing op rs rt rd funct ister 3. Base addressing op rs rt address ister + memory word 46 23
I 5 modi di indirizzamento 4. PC-relative addressing op rs rt Address PC + Memory word 5. Pseudo-direct addressing op PC offset PC : memory word 47 Costanti 48 24
Costanti Spesso le operazioni richiedono l'uso di costanti (ad esempio: somma del valore decimale 4 al contenuto di un istro) Sono possibili 3 opzioni: le costanti risiedono in memoria e sono caricate con lw utilizzo di istri speciali (es: $zero) utilizzare versioni alternative delle istruzioni di tipo I in cui un operando è una costante utilizzo di modalità di indirizzamento immediato La costante è memorizzata nel campo di 16 bit denominato indirizzo 49 Esempi di costanti addi $s0, $s0, 4 # $s0 $s0 + 4 (sign-extended) slti $t0, $s2, 10 # $t0 = 1 if $s2 < 10 andi $s0, $s0, 6 # $s0 $s0 and 6 (zero-extended) ori $s0, $s0, 10 # $s0 $s0 or 10 (zero-extended) li $s0, 20 # $s0 20 (pseudo-instruction) Le istruzioni di tipo I consentono di rappresentare costanti esprimibili in 16 bit ( fino a 65536 ) I valori immediati sono espressi in assembly in rappresentazione decimale ma possono anche essere esadecimali o binari esempio: li $t1,0xa # $t1 = 10 50 25
Gestione costanti a 32 bit Le istruzioni di tipo I consentono di rappresentare costanti esprimibili in 16 bit (valore massimo 65535 unsigned) Se 16 bit non sono sufficienti per rappresentare la costante, l'assemblatore (o il compilatore) deve fare due passi: utilizza l'istruzione lui (load upper immediate) per caricare i 16 bit più significativi della costante nei 16-bit più significativi di un istro (i rimanenti 16-bit meno significativi del istro sono posti a 0) una successiva istruzione specifica i rimanenti 16 bit meno significativi della costante Il istro $at è riservato all'assemblatore per creare costanti su 32-bit (costanti lunghe') 51 Istruzione lui (load upper immediate) L'istruzione load upper immediate: lui rt, imm carica i 16-bit del campo immediato nei 16-bit più significativi del istro rt (i rimanenti 16-bit meno significativi del istro rt sono posti a 0) Pseudo-istruzione: li rdest, imm carica il valore imm nel istro rdest 52 26
Istruzione lui: esempio Si vuole caricare in $s0 la costante a 32 bit: 0000 0000 0011 1101 0000 1001 0000 0000 lui $s0, 61 # 61 = 0000 0000 0011 1101 valore di $s0 : 0000 0000 0011 1101 0000 0000 0000 0000 addi $s0, $s0, 2304 # 2304 = 0000 1001 0000 0000 valore di $s0 : 0000 0000 0011 1101 0000 1001 0000 0000 53 Istruzione li: esempio Si consideri la costante a 32-bit: 118345 (0x1CE49) Si consideri l'istruzione: li $t1, 118345 # $t1 <- 118345 118345 0000 0000 0000 0001 1100 1110 0100 1001 16-bit più significativi valore 1 10 16-bit meno significativi valore 52809 10 54 27
Istruzione li: esempio L'assemblatore sostituisce l'istruzione originale con le seguenti istruzioni: lui $at, 1 # 1 = 0000 0000 0000 0001 valore di $at: 0000 0000 0000 0001 0000 0000 0000 0000 ori $t1, $at, 52809 # $t1 $at or 52809 valore di $t1: 0000 0000 0000 0001 1100 1110 0100 1001 55 Creazione di costanti a 32 bit L'istruzione addi esegue estensione di segno cioè copia il bit più a sinistra del campo immediato di 16-bit dell'istruzione nei 16-bit più significativi dell operando L'istruzione ori esegue estensione di zero cioè carica tutti zeri nei 16-bit più significativi dell operando L'istruzione ori è usata dall'assemblatore assieme con l'istruzione lui per creare costanti su 32-bit 56 28
Indirizzo di un array (pseudoistr. la) Un array è allocato nella porzione static data del data segment Pseudoistruzione la rdest, symbolic_address es.: la $s3, Address Durante la compilazione Address è noto Esempio Address = 1000 00A4 16 Si deve porre questo valore in $s3 usando istruzioni reali Immediate field ha solo 16 bits (4 cifre esadecimali) Si implementa la con due istruzioni lui $s3, 0x1000 ori $s3,$s3,0x00a4 57 58 29