Calcolatori Elettronici Il linguaggio assemblativo MIPS (1) Istruzioni di ALU: operazioni ed operandi Trasferimenti tra memoria e CPU Vettori (1) Le costanti Livelli di astrazione s o f t w a r e H W Linguaggio ad alto livello (es., C) Compilatore Linguaggio assemblativo Assemblatore Linguaggio macchina Interpretazione della macchina Segnali di controllo temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; lw $to, 0($2) lw $t1, 4($2) sw $t1, 0($2) sw $t0, 4($2) 0000 1001 1100 0110 1010 1111 0101 1000 1010 1111 0101 1000 0000 1001 1100 0110 1100 0110 1010 1111 0101 1000 0000 1001 0101 1000 0000 1001 1100 0110 1010 1111 Calcolatori Elettronici - MIPS(1) - Slide 2 L. Tarantino - a.a. 2004/2005 1
Il livello del linguaggio assemblativo è un astrazione del livello sottostante (il linguaggio macchina) operazioni ed operandi (ad es., indirizzi di memoria) sono rappresentati in modo simbolico dato il legame col linguaggio macchina, macchine diverse presentano linguaggi assemblativi diversi non esistono standard, a differenza dei linguaggi ad alto livello esistono però modelli rappresentativi di classi di macchine della stessa tipologia l architettura Intel non è adatta a fungere da modello (troppo complessa perchè ottenuta da continui arricchimenti di processori precedenti) Calcolatori Elettronici - MIPS(1) - Slide 3 L. Tarantino - a.a. 2004/2005 RISC vs CISC CISC : Complex Instruction Set Computer architettura tradizionale RISC : Reduced Instruction Set Computer architettura nata alla fine degli anni 70, adottata dalle workstation degli anni 80 e 90 Architettura di riferimento: Microprocessore MIPS set di istruzioni facili da capire rappresentativo di macchine reali RISC (ad es., poche differenze con PowerPC) Calcolatori Elettronici - MIPS(1) - Slide 4 L. Tarantino - a.a. 2004/2005 2
Nel linguaggio C Operatori aritmetici : +, -, *, /, % (mod) Operandi: Variabili: a, b, c Costanti: 0, 1000, -17, 15 Le variabili devono essere dichiarate e devono avere un tipo int fahr, celsius; int a, b, c, d, e; Istruzione di assegnamento: variabile = espressione Esempi: a = b + c; a = b + c + d - e; celsius = 5 * (fahr - 32) / 9; Calcolatori Elettronici - MIPS(1) - Slide 5 L. Tarantino - a.a. 2004/2005 Istruzioni aritmetiche - sintassi In C a = b + c In MIPS add a, b, c ancora da raffinare Sintassi rigida: 1 operatore e 3 variabili operatore indicato per nome tre operandi: il primo è la destinazione del risultato il secondo e il terzo sono i dati da elaborare Semplicità e regolarità mantengono l hardware semplice e più facilmente ottimizzabile Calcolatori Elettronici - MIPS(1) - Slide 6 L. Tarantino - a.a. 2004/2005 3
Espressioni In C a = b + c + d - e; In MIPS serve una sequenza di istruzioni aritmetiche add a, b, c add a, a, d sub a, a, e # qui a vale b + c # qui a vale b + c + d # qui a vale b + c + d - e dopo il # inizia un commento Nota ogni linea di codice contiene esattamente un istruzione il commento termina con la fine della linea Calcolatori Elettronici - MIPS(1) - Slide 7 L. Tarantino - a.a. 2004/2005 Esercizio Tradurre in MIPS ( compilare a mano ) le seguenti istruzioni C: a = b + c - d; Soluzione add a, b, c sub a, a, d # qui a vale b + c # qui a vale b + c - d Calcolatori Elettronici - MIPS(1) - Slide 8 L. Tarantino - a.a. 2004/2005 4
Uso delle variabili temporanee (1) Compilare a mano la seguente istruzione C f = (g + h) - (i + j); Il compilatore crea variabili temporanee per i risultati intermedi Partiamo con la somma di g e h add t0,g,h # t0 contiene g + h Ora sommiamo i e j add t1,i,j # t1 contiene i + j Calcoliamo la differenza sub f,t0,t1 # f = t0 - t1 =(g+h)-(i+h) Calcolatori Elettronici - MIPS(1) - Slide 9 L. Tarantino - a.a. 2004/2005 Uso delle variabili temporanee (2) Riassumendo f = (g + h) - (i + j); add t0,g,h add t1,i,j sub f,t0,t1 # t0 contiene g + h # t1 contiene i + j # f = t0 - t1 =(g+h)-(i+h) Alternativamente: add f,g,h add t1,i,j sub f,f,t1 # f = g + h # t1 = i + j # f = f - t1 =(g+h)-(i+h) Calcolatori Elettronici - MIPS(1) - Slide 10 L. Tarantino - a.a. 2004/2005 5
Istruzioni aritmetiche MIPS - gli OPERANDI Solo i 32 registri del banco ciò riduce il tempo di esecuzione delle istruzioni aritmetiche perchè il tempo di accesso al banco dei registri è minore del tempo di accesso alla memoria: più piccolo è più veloce Convenzioni per i nomi dei registri $s0, $s1, per i registri che correspondono a variabili C $t0, $t1, per i registri che correspondono a variabili temporanee Nota le variabili C devono essere dichiarate, i registri sono prefissati e non devono essere dichiarati Calcolatori Elettronici - MIPS(1) - Slide 11 L. Tarantino - a.a. 2004/2005 Uso dei registri Compilare a mano la seguente istruzione C f = (g + h) - (i + j); fissiamo una corrispondenza Var Registro f $s0 g $s1 h $s2 i $s3 j $s4 add $t0,$s1,$s2 add $t1,$s3,$s4 # $t0 = g + h # $t1 = i + j sub $s0,$t0,$t1 # $s0 = $t0 - $t1 Calcolatori Elettronici - MIPS(1) - Slide 12 L. Tarantino - a.a. 2004/2005 6
Strutture di dati (ad es., array) Il banco è troppo piccolo per contenerle, quindi: devono risiedere in memoria Le istruzioni di ALU accettano solo i registri come operandi, quindi le singole componenti della struttura devono essere trasferite nei registri quando sono oggetto di elaborazioni servono istruzioni di trasferimento dati tra registri e memoria Calcolatori Elettronici - MIPS(1) - Slide 14 L. Tarantino - a.a. 2004/2005 Ripasso sulla memoria Può essere vista come un array monodimensionale di byte Al concetto di indice corrisponde il concetto di indirizzo in memoria E indirizzabile al byte se l indirizzo individua un byte (1B = 8 bit) La parola è formata da 32 bit (4 byte) L indirizzo della parola è l indirizzo di uno dei suoi byte (MSB se Big Endian, LSB se Little Endian) 8 bit 0 4 8 12... 32 bit Calcolatori Elettronici - MIPS(1) - Slide 15 L. Tarantino - a.a. 2004/2005... 0 1 2 3 4 5 6 7
Nel MIPS Memoria allineata (le parole iniziano sempre ad indirizzi multipli di 4) Indirizzamento di tipo Big Endian Indirizzi da 32 bit Posso indirizzare 2 32 byte diversi 1 parola = 4 byte 2 30 parole di memoria Allineata Non Allineata 0 1 2 3 Big Endian MSB (most significant byte) 0 1 2 3 Calcolatori Elettronici - MIPS(1) - Slide 16 L. Tarantino - a.a. 2004/2005 Accessi in memoria (1) Lettura la CPU fornisce un indirizzo i la memoria restituisce il contenuto della parola di indirizzo i (da memorizzare in un registro) i... Banco $sx Mem[i] oppure $tx Mem[i] Memoria CPU Calcolatori Elettronici - MIPS(1) - Slide 17 L. Tarantino - a.a. 2004/2005 8
Accessi in memoria (2) Scrittura la CPU fornisce un indirizzo i e un dato (prelevato da un registro) la memoria scrive il dato nella parola di indirizzo i i... Banco Mem[i] $sx oppure Mem[i] $tx Memoria CPU Calcolatori Elettronici - MIPS(1) - Slide 18 L. Tarantino - a.a. 2004/2005 Nel linguaggio assemblativo LOAD indica il trasferimento memoria CPU STORE indica il trasferimento CPU memoria Codici operativi nel MIPS lw (load word) sw (store word) il codice operativo contiene un informazione sulla quantità di informazione coinvolta nel trasferimento Calcolatori Elettronici - MIPS(1) - Slide 19 L. Tarantino - a.a. 2004/2005 9
lw Sintassi : codice operativo registro da caricare indirizzo della parola di memoria Esempio caricare (load) in $t0 una componente del vettore A l indirizzo di partenza del vettore è memorizzato in $s3 lw $t0, 8($s3) registro con la base del vettore registro destinazione spiazzamento (x l indice!!) Calcolatori Elettronici - MIPS(1) - Slide 20 L. Tarantino - a.a. 2004/2005 sw Sintassi : codice operativo registro il cui contenuto va spostato in memoria indirizzo della parola di memoria Esempio memorizzare il contenuto di $t0 in una componente del vettore A l indirizzo di partenza del vettore è memorizzato in $s3 sw $t0, 8($s3) registro con la base del vettore registro sorgente spiazzamento (x l indice!!) Calcolatori Elettronici - MIPS(1) - Slide 21 L. Tarantino - a.a. 2004/2005 10
Indirizzo in memoria devo determinare l indirizzo della parola implicata nel trasferimento lo spiazzamento dice quanto dista la parola in questione dalla base del vettore, cioè specifica di quanto mi devo spostare dalla base NOTA BENE se una componente del vettore occupa una parola, per spostarmi da una componente alla successiva mi devo spostare di 4 byte 0 4 8 12... 32 bit Vettore in memoria Base = 4 Componente A[0] 4 A[1] 8 A[2] 12 indirizzo di A[i] = indirizzo di A[i-1] + 4 Indirizzo indirizzo di A[i] = base + 4 * indice Calcolatori Elettronici - MIPS(1) - Slide 22 L. Tarantino - a.a. 2004/2005 Usando la sintassi delle lw e sw se la base è in $s3 indirizzo di A[i] = base + 4 * indice Componente Indirizzo 4 * indice In MIPS A[0] 4 0*4 = 0 0($s3) A[1] 8 1*4 = 4 4($s3) A[2] 12 2*4 = 8 8($s3) per trovare l indirizzo sommo lo spiazzamento al registro di base Calcolatori Elettronici - MIPS(1) - Slide 23 L. Tarantino - a.a. 2004/2005 11
Esempio Compilare la seguente istruzione C g = h + A[8]; Var Registro fissiamo una g $s1 corrispondenza h $s2 base A $s3 Trasferiamo A[8] in un registro temporaneo lw $t0,32($s3) # NB: spiazzamento = 4 * indice Ora sommiamogli h e poniamo la somma in g add $s1, $s2, $t0 # $s1 = h + A[8] Calcolatori Elettronici - MIPS(1) - Slide 24 L. Tarantino - a.a. 2004/2005 Esempio (1) Compilare la seguente istruzione C B[8] = h + A[4]; Var Registro fissiamo una h $s2 corrispondenza base A $s3 base B $s4 Trasferiamo A[4] in un registro temporaneo lw $t0,16($s3) # NB: spiazzamento = 4 * indice Ora sommiamogli h e poniamo la somma in un registro temporaneo add $t1, $t0, $s2 # $t1 = A[4] + h Ora trasferiamo il risultato in B[8] sw $t1, 32($s4) # spiazzamento = 4 * indice Calcolatori Elettronici - MIPS(1) - Slide 26 L. Tarantino - a.a. 2004/2005 12
Esempio (2) Ricapitolando B[8] = h + A[4]; lw $t0,16($s3) # spiazzamento = 4 * indice add $t1, $t0, $s2 # $t1 = A[4] + h sw $t1, 32($s4) # spiazzamento = 4 * indice Calcolatori Elettronici - MIPS(1) - Slide 27 L. Tarantino - a.a. 2004/2005 Trattamento degli indici Che succede quando l indice è una variabile? g = h + A[i]; Var Registro g $s1 h $s2 base A $s3 i $s4 lw $t0,$s4($s3) NO!!! la sintassi non lo prevede Lo spiazzamento deve essere sempre una costante da sommare alla base Trucco : lw $t0,0($t1) in $t1 calcolo l indirizzo di A[i] e poi gli sommo 0 Calcolatori Elettronici - MIPS(1) - Slide 29 L. Tarantino - a.a. 2004/2005 13
Esempio (1) in $t1 calcolo l indirizzo di A[i] e poi gli sommo 0 g = h + A[i]; indirizzo di A[i] = base + 4 * indice Per calcolare la moltiplicazione uso la somma: i + i = 2i 2i + 2i = 4i Uso il registro temporaneo $t1 add $t1,$s4,$s4 # $t1 = 2*i add $t1,$t1,$t1 # ora $t1 = 4*i Ora gli sommo la base di A add $t1,$t1,$s3 # $t1=indirizzo di A[i] (4*i+$s3) Ora carico A[i] nel registro temporaneo $t0 lw $t0,0($t1) # $t0 = A[i] Infine gli sommo h e metto il risultato in g add $s1,$s2,$t0 # g = h + A[i] Calcolatori Elettronici - MIPS(1) - Slide 30 L. Tarantino - a.a. 2004/2005 Esempio (2) g = h + A[i]; add $t1,$s4,$s4 # qui $t1 = 2*i add $t1,$t1,$t1 # ora $t1 = 4*i add $t1,$t1,$s3 # $t1=indirizzo di A[i] = 4*i+$s3 lw $t0,0($t1) # $t0 = A[i] add $s1,$s2,$t0 # g = h + A[i] Calcolatori Elettronici - MIPS(1) - Slide 31 L. Tarantino - a.a. 2004/2005 14
Il trattamento delle costanti Nelle espressioni C possono apparire dei valori costanti i = i + 10; Prima soluzione Tenere le costanti in memoria e prelevarle quando serve lw $t0, 0($s0) # carica 10 in $t0 add $s3,$s3,$t0 # i = i + 10 $s0 contiene l indirizzo della parola dove c è 10 l indirizzo viene sempre calcolato come base + spiazzamento se l indirizzo della parola di interesse è in un registro, lo considero come base ed assegno uno spiazzamento nullo Calcolatori Elettronici - MIPS(1) - Slide 33 L. Tarantino - a.a. 2004/2005 Operandi immediati Seconda soluzione (più efficiente) Prevedere delle istruzioni che presentino valori costanti ( immediati ) addi $s3,$s3,10 # i = i + 10 la "i " del codice operativo indica la presenza dell operando immediato Vantaggi Non c è bisogno di accedere alla memoria Una istruzione invece che due Calcolatori Elettronici - MIPS(1) - Slide 34 L. Tarantino - a.a. 2004/2005 15
Trattamento della costante zero Uso molto frequente Uno dei 32 registri del banco contiene sempre zero Questo registro viene indicato con $zero Lo zero è utile anche per trasferire dati da un registro all altro: add $s0, $s1, $zero # $s0 = $s1 + 0 ($s0 $s1) Calcolatori Elettronici - MIPS(1) - Slide 35 L. Tarantino - a.a. 2004/2005 16