Indice Linguaggio ad alto livello, linguagio assembler e linguaggio macchina Il linguaggio assembler MIPS: istruzioni aritmetiche, di trasferimento dati e di salto Conversione linguaggio assembler in linguaggio macchina Gestione delle procedure. Uso della pila Modi di indirizzamento Sintassi di un programma in assembler MIPS SPIM Confronto con altre architetture: PowerPC e Intel 80x86 Introduzione le CPU lavorano con linguaggio macchina sequenza di cifre binarie Il linguaggio assembler e la rappresentazione simbolica (mnemonica) della codifica binaria usata dal calcolatore (linguaggio macchina) simboli al posto di bits codici delle istruzioni (opcodes) registri uso di etichette macro La codifica binaria delle istruzioni si trova in memoria 6 7 Linguaggio macchina Si intende l insieme delle operazioni direttamente eseguibili dall hardware Ogni operazione e richiesta da un istruzione Un insieme di istruzioni costituisce un programma Ogni istruzione deve specificare che tipo di operazione e richiesta e quali sono i suoi operandi Linguaggio assembler Piu primitivo dei linguaggi di alto livello e.g., manca un controllo di flusso sofisticato Molto restrittivo e.g., Instruzioni Aritmetiche del MIPS Noi lavoreremo con l architettura del set di instruzioni MIPS simile ad altre architetture sviluppate a partire dagli anni 80 usata da NEC, Nintendo, Silicon Graphics, Sony Obiettivi di Progetto: massimizzare la performance e minimizzare il costo, ridurre il tempo di progettazione 8 9
Linguaggio alto livello, assembler, macchina Vantaggi e svantaggi del linguaggio assembler Programma che calcola e stampa la somma dei quadrati dei primi 100 interi #include <stdio.h> int main () { int i; int sum = 0; for (i = 0; i <= 100; i = i + 1) sum = sum + i * i; printf ("The sum from 0.. 100 is %d\n", sum); }.text.align 2.globl main main: subu $sp, $sp, 32 sw $ra, 20($sp) sd $a0, 32($sp) sw $0, 24($sp) sw $0, 28($sp) loop: lw $t6, 28($sp) mul $t7, $t6, $t6 lw $t8, 24($sp) addu $t9, $t8, $t7 sw $t9, 24($sp) addu $t0, $t6, 1 sw $t0, 28($sp) ble$t0, 100, loop la $a0, str lw $a1, 24($sp) jal printf move$v0, $0 lw $ra, 20($sp) ddu $sp, $sp, 32 jr $ra.data.align 0 str:.asciiz "The sum from 0.. 100 is %d\n" 00100111101111011111111111100000 10101111101111110000000000010100 10101111101001000000000000100000 10101111101001010000000000100100 10101111101000000000000000011000 10101111101000000000000000011100 10001111101011100000000000011100 10001111101110000000000000011000 00000001110011100000000000011001 00100101110010000000000000000001 00101001000000010000000001100101 10101111101010000000000000011100 00000000000000000111100000010010 00000011000011111100100000100001 00010100001000001111111111110111 10101111101110010000000000011000 00111100000001000001000000000000 10001111101001010000000000011000 00001100000100000000000011101100 00100100100001000000010000110000 10001111101111110000000000010100 00100111101111010000000000100000 00000011111000000000000000001000 00000000000000000001000000100001 10 Vantaggi velocita d esecuzione (es.: calcolatori embedded) occupazione di memoria collegabile a programmi ad alto livello possibilita di usare istruzioni specializzate Svantaggi minore portabilita fattore di espansione elevato => minore produttivita minore leggibilita no programmazione strutturata Nota: la performance deve essere valutata sulle istruzioni reali 11 Gerarchia di trasformazione Programma in C Compilatore Programma in linguaggio assembler Assemblatore Modulo oggetto: Linguaggio macchina Modulo oggetto: Librerie Linker Eseguibile Loader Memoria 12 Gerarchia di trasformazione Un programma scritto in linguaggio ad alto livello viene: compilato in linguaggio assembler assemblato per ottenere un modulo oggetto in linguaggio macchina il linker combina uno o piu moduli oggetto con le procedure contenute nelle librerie per esplicitare tutti i riferimenti incrociati il loader colloca il codice macchina in opportune locazioni di memoria in modo che possa essere eseguito dal processore. 13
Gli assemblatori Il formato del file oggetto Il processo di traduzione e costituito da due parti: traduzione in indirizzi delle locazioni di memoria etichettate traduzione istruzioni assembler (codice operativo, identificatori di registri, etichette) in istruzione macchina File oggetto etichetta esterna (o globale) etichetta locale (funzione static in C) Riferimenti in avanti => tabella dei simboli. E composto da 6 parti Intestazione del file oggetto, Segmento di testo, Segmento di dato, Informazioni di rilocazione, Tabella dei simboli, Informazioni per il debugger Funzionalita aggiuntive direttive per la codifica dei dati macro 14 15 Linker - Loader - Uso della memoria Compilazione separata => diversi moduli Il linker unisce i files: cerca le procedure usate nelle librerie riloca i file oggetto risolve i riferimenti tra files Il loader (in unix): lettura dell intestazione del file eseguibile per determinare la sua dimensione creazione di uno spazio di indirizzamento sufficiente copia delle istruzioni e dei dati dal file eseguibile alla memoria copia nello stack degli eventuali parametri passati al programma principale inizializzazione dei registri dell elaboratore (es. stack pointer, ) salto ad una procedura di inizializzazione (start-up routine) che chiama la procedura principale del programma (main) 16 Aritmetica MIPS Tutte le instruzioni hanno 3 operandi Una linea puo contenere una sola istruzione L ordine degli operandi e fissato ( destinatione per prima) Forma: operatore operando1, operando2, operando3 Significato: operando1 = operando2 operatore operando3 Esempio: codice MIPS : add $s0, $s1, $s2 codice C : a = b + c 17
Aritmetica MIPS Principio di progetto1: semplificare per favorire la regolarita Svantaggi della regolarita C code: a = b + c + d; e = f - a; MIPS code: add $t0, $s1, $s2 add $s0, $t0, $s3 sub $s4, $s5, $s0 Gli operandi devono essere registri solo 32 registri da 4Bytes (= 1 Word) Principio di progetto2: dimensioni minori => maggiore velocita Convenzioni sull uso dei registri Registro: locazione di memoria elementare all interno del processore Nome Numero Uso $zero 0 il valore costante 0 $v0-$v1 2-3 valori per risultati di espressioni $a0-$a3 4-7 argomenti $t0-$t7 8-15 temporanei $s0-$s7 16-23 salvati $t8-$t9 24-25 altri temporanei $gp 28 global pointer $sp 29 stack pointer $fp 30 frame pointer $ra 31 return address $at 1 riservato $k0 26 riservato $k1 27 riservato 18 19 Moltiplicazione e divisione Coppia di registri 32 bit (Hi,Lo) che contengono il prodotto di una moltiplicazione ed il resto ed il quoziente, rispettivamente, di una divisione. Istruzioni mflo,mfhi per accedere ai registri Hi e Lo Esempio: mult $s2,$s3 mflo $s1 #$s1 = Lo (copia di Lo in $s1) Compito del programmatore evitare l overflow e controllare che non ci siano divisioni improprie (per zero). Istruzione Esempio Significato Commenti move from Hi mfhi $1 $1 = Hi Copia Hi in $1 move from Lo mflo $1 $1 = Lo Copia Lo in $1 move to Hi mthi $1 Hi = $1 Copia $1 in Hi move to Lo mtlo $1 Lo = $1 Copia $1 in Lo 20 Overflow Il risultato dell operazione non e rappresentabile dall hw disponinibile I numeri rappresentabili sono da 0 a (2 32-1) (unsigned) da -2 31 a (2 31-1) (signed) Condizioni di overflow (numeri signed): A>0; B>0 e si ottiene A+B<0 A<0; B<0 e si ottiene A+B 0 A 0; B<0 e si ottiene A-B<0 A<0;B 0 e si ottiene A-B 0 Le operazioni addu,subu,mult, multu, div e divu non fanno alcun controllo sull overflow 21
Istruzioni Aritmetiche Qualche esempio Istruzione Esempio Significato Commenti add add $1,$2,$3 $1 = $2 + $3 3 operandi; eccezione possibile add immediate addi $1,$2,100 $1 = $2 + 100 + cost; eccezione possibile add unsigned addu $1,$2,$3 $1 = $2 + $3 3 operandi; nessuna eccezione add imm. unsign. addiu $1,$2,100 $1 = $2 + 100 + costante; nessuna eccezione subtract sub $1,$2,$3 $1 = $2 $3 3 operandi; eccezione possibile subtract unsigned subu $1,$2,$3 $1 = $2 $3 3 operandi; nessuna eccezione multiply mult $2,$3 Hi, Lo = $2 x $3 64-bit prodotto con segno multiply unsigned multu $2,$3 Hi, Lo = $2 x $3 64-bit prodotto senza segno divide div $2,$3 Lo = $2 $3, Lo = quoziente, Hi = resto Hi = $2 mod $3 divide unsigned divu $2,$3 Lo = $2 $3, Quoziente & resto senza segno Hi = $2 mod $3 shift right arit. sra $1,$2,10 $1 = $2 >> 10 Shift a destra (segno esteso) shift right arit.var. srav $1,$2, $3 $1 = $2 >> $3 Shift aritm. a destra di # bit var. 22 Esempio1 #a = b + c + d + e add a, b, c #a = b + c add a, a, d #a = a + d add a, a, e #a = a + e Esempio2 #f = (g + h) - (i + j) add $t0, g, h #$t0 = g + h add $t1, i, j #$t1 = i + j sub f, $t0, $t1 #f = $t0 - $t1 23 Registri e Memoria Indirizzamento al byte Le istruzioni aritmetiche operano su registri solo 32 registri ogni registro 1W (4B) il compilatore associa variabili con registri Cosa succede con programmi con tanti dati (variabili, array)? usiamo la memoria, che contiene anche i programmi Memoria MIPS indirizzata al Byte Control Datapath Processor 0 1 2 3 4 5 6... Memory Input Output I/O E l indirizzamento usato dalla maggior parte delle architetture MIPS: le parole iniziano sempre ad indirizzi multipli di 4 (vincolo di allineamento) Indirizzo = indirizzo base + offset x 4 Ordinamento dei byte in memoria big endian (MIPS, Sparc, Motorola 68k) l indirizzo di una parola corrisponde all indirizzo del byte piu significativo little endian (Intel 80x86, DEC Alpha) l indirizzo di una parola corrisponde indirizzo del byte meno significativo 24 25
Ordinamento dei byte in memoria Organizzazione della memoria L indirizzamento al byte e comodo, ma i dati sono memorizzati in words (32 bits o 4 bytes) I registri contengono 32 bits di dati Organizzazione della memoria: 2 32 bytes con indirizzi da 0 a 2 32-1 2 30... words con indirizzi 0, 4, 8,... 2 32-4 Le words sono allineate quali sono i due bits meno significativi dell indirizzo di una parola? 0 4 8 12 32 bits of data 32 bits of data 32 bits of data 32 bits of data 26 27 Istruzioni di trasferimento dati sw (Store Word) reg. => word in memoria lw (Load Word) word in memoria => reg. Forma: operatore registro, offset(indirizzo_base) #[indice] e opzionale sw ha la destinazione come ultimo operando Esempio: C code: MIPS code: A[9] = h + A[8]; # h<=>$s2; A[0]<=>$s3 lw $t0, 32($s3) add $t0, $s2, $t0 sw $t0, 36($s3) 28 Un esempio swap(int v[], int k); { int temp; temp = v[k] v[k] = v[k+1]; v[k+1] = temp; } swap: add $t1, $a1, $a1 add $t1, $t1, $t1 add $t1, $a0, $t1 lw $t0, 0($t1) lw $t2, 4($t1) sw $t2, 0($t1) sw $t0, 4($t1) jr $ra #v<=>$a0; k<=>$a1; temp<=>$t0 29
Esempio con indice variabile Spilling g = h + A[i] g $s1 h $s2 A i $s3 (indirizzo base) $s4 (offset) MIPS code: add $t1, $s4, $s4 add $t1, $t1, $t1 add $t1, $t1, $s3 lw $t0, 0($t1) add $s1, $s2, $t0 In memoria si mettono le variabili meno usate Ricorda: gli operandi aritmetici sono registri, non celle di memoria tempo accesso ai registri e minore throughput migliore 1 ciclo di clock: lettura due registri, esecuzione operazione scrittura risultato 30 31 Istruzioni di trasferimento dati ISTRUZIONE ESEMPIO SIGNIFICATO caricamento di li $s1, 10 $s1 = 10 una costante caricamento costante la $s1, ind $s1 = ind di tipo indirizzo (32bit) caricamento del byte lb $s1, ind $s1 = (ind) memorizz. all indirizzo ind caricamento della lw $s1, ind $s1 = (ind) word memorizz. all indirizzo ind memorizz. del byte sb $s1, ind ind = ($s1) contenuto nel registro $1 all indirizzo ind memorizz. della word sw $s1, ind ind = ($s1) contenuto nel registro $1 all indirizzo ind Riassumendo MIPS load/store word, con indirizzamento al byte aritmetica solo su registri Istruzioni Significato add $t1, $t2, $t3 $t1 = $t2 + $t3 sub $t1, $t2, $t3 $t1 = $t2 - $t3 lw $t0, 100($t1) $t0 = Memory[$t1+100] sw $t0, 100($t1) Memory[$t1+100] = $t0 NOTA: li e la sono pseudoistruzioni 32 33
Linguaggio macchina Linguaggio macchina Istruzioni, registri e words di dati sono di 32 bits sono rappresentati all interno del calcolatore come serie di segnali elettrici ovvero, numeri in base 2 Esempio: add $t0, $s1, $s2 I registri sono numerati: $t0=8, $s1=17, $s2=18 Formato istruzione R-type: 000000 10001 10010 01000 00000 100000 op rs rt rd shamt funct 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit 34 op : codice operativo (opcode) dell istruzione rs: primo operando (registro) rt: secondo operando (registro) rd: registro destinazione, che contiene il risultato dell operazione shamt: valore dell offset (scalamento, shift amount) funct: seleziona una variante dell operazione base specificata dall opcode (codice funzione, function code) 35 Rappresentazione delle istruzioni Formato istruzione (R-type): 3 registri le istruzioni lw e sw? 2 registri e una costante 5 bit non sono sufficienti occorre nuovo formato Formato istruzione (I-type) 6bit 5bit 5bit 16bit op rs rt address opcode base Dest(lw) Spazio di indirizzamento: ±2 15 =±2 13 parole Principio di progetto 3: Rappresentazione delle istruzioni esempio lw $t0, 32($s3) lw $8, 32($19) 35 19 8 32 op rs rt address opcode base Dest Compromesso di progetto anche lw/sw sono lunghe 1w, con displacement costante (operando immediato di 16 bit) inserito direttamente nell istruzione un buon progetto richiede buoni compromessi 36 37