La programmazione dei calcolatori L insieme delle istruzioni Architetture dei Calcolatori (lettere A-I) Linguaggio macchina (codifica con numeri binari) Linguaggio direttamente comprensibile dal calcolatore Attività di programmazione lunga e noiosa Facile commettere errori Linguaggio assembler (o assembly) Rappresentazione simbolica del linguaggio macchina Più comprensibile del linguaggio macchina (simboli anziché sequenze di bit) Tradotto dall assemblatore in linguaggio macchina Dalla forma simbolica dell istruzione macchina al corrispondente formato binario Linguaggi ad alto livello Tradotti dal compilatore in assembler Valeria Cardellini 1 Benefici dei linguaggi ad alto livello Notazione vicina al linguaggio corrente ed alla notazione algebrica (maggiore espressività e leggibilità) Incremento di produttività Facilitano la programmazione, svincolandola dalla conoscenza dei dettagli architetturali della macchina utilizzata Indipendenza dalle caratteristiche peculiari dell architettura (processore) su cui il programma va eseguito (portabilità) Ideati non per essere compresi direttamente da macchine reali, ma da macchine astratte, in grado di effettuare operazioni più di alto livello rispetto alle operazioni elementari dei processori reali Permettono l uso di librerie di funzionalità già scritte (riusabilità del codice) Valeria Cardellini 2 Vantaggi e svantaggi dell assembler Vantaggio: la dipendenza dall architettura del calcolatore permette Ottimizzazione delle prestazioni (maggiore efficienza) Programmi (potenzialmente) più compatti Massimo sfruttamento delle potenzialità dell hardware sottostante Importante per Programmare controller di processi e macchinari (anche real-time) Programmazione di apparati limitati (embedded computer, dispositivi portatili, telefonini cellulari, ) Principali svantaggi della programmazione Strutture di controllo in forme limitate (minore espressività) Necessario conoscere i dettagli dell architettura Mancanza di portabilità su architetture diverse Difficoltà di comprensione, possibile lunghezza maggiore, facilità di errore rispetto a programmi scritti in linguaggio ad alto livello (minore produttività del programmatore) Valeria Cardellini 3
Compilazione Nella prima fase, il programma ad alto livello viene tradotto nel linguaggio assembler utilizzando un apposito programma detto compilatore Dopo la fase di compilazione, il programma scritto il linguaggio assembler viene tradotto in linguaggio macchina utilizzando un apposito programma detto assemblatore (assembler) Spesso con il termine compilazione si indica l intero processo di traduzione da linguaggio ad alto livello a linguaggio macchina (essendo l assemblatore spesso integrato con il compilatore) Il processo di compilazione Programma sorgente compilatore hello.c Programma in linguaggio assembler hello.s assemblatore Programma in linguaggio macchina (codice oggetto) caricatore hello.out Il programma sorgente è scritto in un linguaggio ad alto livello (ad es., C) Il codice oggetto, scritto in linguaggio macchina, viene memorizzato su disco Il caricatore (loader) carica il programma in memoria principale per l esecuzione Programma in memoria Valeria Cardellini 4 Valeria Cardellini 5 Il linker Il linker (link editor o collegatore) ha il compito di collegare tra loro vari moduli che compongono lo stesso programma Programma sorgente suddiviso in più file che vengono compilati separatamente creando diversi file oggetto Utilizzo di funzioni di libreria Il processo di compilazione (2) Programma sorgente compilatore Programma in linguaggio assembler Il linker collega tra loro i file contenenti il codice oggetto dei vari moduli che costituiscono il programma, unendovi anche il codice delle funzioni di libreria utilizzate, producendo un file contenente il codice eseguibile, memorizzato su disco assemblatore Oggetto: modulo in linguaggio macchina linker Oggetto: libreria di funzioni caricatore Valeria Cardellini 6 Eseguibile: programma in linguaggio macchina Programma in memoria Valeria Cardellini 7
Alcuni principi progettuali Le istruzioni sono codificate in forma binaria I programmi vengono immagazzinati in memoria insieme ai dati Concetto di programma memorizzato In memoria istruzioni e operandi, che devono essere entrambi trasferiti dalla memoria al processore Le istruzioni non sono di per sé distinguibili rispetto agli altri tipi di informazione in memoria Solo l interpretazione da parte del processore stabilisce se una data configurazione di bit è da considerarsi come un dato o un istruzione Storicamente Architettura introdotta nel 1946 da Von Neumann Opposta alla architettura Hardware, in cui lo spazio di memoria è separato per dati e programmi (impiegata in calcolatori destinati a specifici campi applicativi, ad es. elaborazione dei segnali) Valeria Cardellini 8 I principi della progettazione L obiettivo è avere un set di istruzioni che Faciliti la costruzione della macchina Semplicità per il progettista Faciliti la costruzione dei compilatori Ottimizzi i costi di produzione Permetta prestazioni elevate Competitività sul mercato Principio della semplicità della realizzazione: semplice significa economico (semplicità = regolarità) affidabile di facile apprendimento ed uso (per i programmatori) di facile traduzione (per i compilatori) Valeria Cardellini 9 Architettura MIPS Sviluppata e progettata a Stanford (USA) Progettata nei primi anni 80 Prodotta e sviluppata da MIPS Technologies negli anni 90 (http://www.mips.com) Tecnologia attualmente utilizzata da Sony (Playstation, Playstation 2, AIBO) Nintendo 64 Router CISCO Stampanti, macchine fotografiche digitali, palmtop Set-top box, DVD TV al plasma Rappresenta un buon modello architetturale per la didattica, perché è un architettura semplice da comprendere Valeria Cardellini 10 Operazioni aritmetiche Le informazioni sono codificate in dati I dati sono rappresentati da numeri Esempio Per effettuare a=b+c e a=b-c add a, b, c sub a, b, c Ogni istruzioni aritmetica in MIPS esegue solo una operazione e deve avere sempre 3 operandi Principio progettuale: la semplicità favorisce la regolarità Il prezzo della semplicità Per effettuare f = (g+h)-(i+j) add t0, g, h add t1, i, j sub f, t0, t1 # calcolo t0=g+h # calcolo t1=i+j # calcolo f=t0-t1 NB: gli operandi non sono ancora quelli reali Commento su ogni linea preceduto da # Valeria Cardellini 11
Gli operandi A differenza dei linguaggi ad alto livello, gli operandi devono provenire da speciali locazioni di memoria all interno del processore, dette registri Nei linguaggi ad alto livello non ci si preoccupa di dover portare i dati dalla memoria ai registri e dai registri alla memoria E compito del compilatore inserire le istruzioni necessarie Caratteristiche dei registri Elevata velocità di accesso In numero limitato Altro principio progettuale: piccolo = veloce Usando i registri Si riduce il traffico con la memoria L esecuzione del programma è più veloce Migliora la densità del codice I registri Il livello ISA dell architettura MIPS richiede che Gli operandi delle istruzioni provengano dai registri Architettura di tipo load-store (o registro-registro) Il processore possiede un numero limitato di registri Il processore MIPS possiede 32 registri di tipo general-purpose (GPR), ciascuno dei quali è composto da 32 bit (parola) Il processore MIPS possiede ulteriori 32 registri da 32 bit per le operazioni in virgola mobile (floating point), detti FPR Per convenzione, per denotare i registri si usano nomi simbolici preceduti da $ Convenzione MIPS per rappresentare i registri: $s0, $s1, per i registri che contengono variabili $t0, $t1, per i registri di uso temporaneo I registri possono anche essere indicati direttamente mediante il loro numero (0,, 31) preceduto da $ (quindi $0,, $31) Valeria Cardellini 12 Valeria Cardellini 13 Il ruolo del compilatore Consideriamo il seguente segmento di programma C che utilizza 5 variabili f = (g+h)-(i+j) Il compilatore associa alle variabili presenti nel programma i registri presenti nel processore Ad esempio, alle variabili f, g, h, i e j sono associati i registri $s0, $s1, $s2, $s3 e $s4 Il compilatore introduce due variabili temporanee (t0 e t1) che associa a due registri temporanei $t0 e $t1 add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1 # g+h # i+j # f = (g+h)-(i+j) Le operazioni e gli operandi Le istruzioni MIPS consentono operazioni di tipo diverso classificabili nelle quattro categorie Istruzioni aritmetiche-logiche (es., somma, moltiplicazione, AND) Istruzioni di trasferimento da/verso memoria Istruzioni per il controllo del flusso del programma Istruzioni di supporto alle procedure Gli operandi Accesso ai registri del processore Accesso alla memoria Necessarie due modalità di trasferimento tra memoria e registri del processore Load (caricamento) o read (lettura) Store (memorizzazione) o write (scrittura) Uso di costanti Valeria Cardellini 14 Valeria Cardellini 15
Istruzioni aritmetiche-logiche In MIPS un istruzione aritmetico-logica possiede tre operandi: i due registri contenenti i valori da elaborare (registri sorgente) ed il registro contenente il risultato (registro destinazione) L ordine degli operandi è fisso: prima il registro contenente il risultato dell operazione e poi i due operandi Esempio: istruzione add Serve per sommare il contenuto di due registri sorgente rs e rt e porre in rd la somma del contenuto di rs e rt add rd, rs, rt Esempio: istruzione sub Serve per sottrarre il contenuto di due registri sorgente rs e rt e porre in rd la differenza del contenuto di rs e rt sub rd, rs, rt Valeria Cardellini 16. 12 8 4 0 Indirizzamento della memoria nel MIPS. Memoria $0 $1 $31. Processore Memoria come un array monodimensionale, le cui locazioni sono indicizzate tramite indirizzi Dimensione della parola pari a 32 bit (4 byte) L indirizzamento di una parola è legato a 4 byte (vincolo dell allineamento) Quindi gli indirizzi delle parole differiscono di 4 Memoria formata da 2 30 parole Per motivi di efficienza, è possibile l indirizzamento a livello dei singoli byte che compongono una parola Valeria Cardellini 17 Ordinamento dei byte L accesso è generalmente con indirizzamento del byte L indirizzo di una parola corrisponde all indirizzo di uno dei byte all interno della parola Esistono due convenzioni per ordinare i byte all interno di una parola (endianess) Big Endian: il byte il cui indirizzo è x 00 è nella posizione più significativa della parola (big end) Little Endian: il byte il cui indirizzo è x 00 è nella posizione meno significativa della parola (little end) Esempio: parola di 32 bit Little Endian 3 7 2 6 1 5 0 4 Indirizzo Byte Byte Word Word Intel 80x06 è Little Endian, MIPS può essere sia Big Endian sia Little Endian in dipendenza del valore logico su di un pin Big Endian Valeria Cardellini 18 0 4 0 4 1 5 2 6 3 7 Allineamento dei byte e terminologia L allineamento richiede che la parola inizi ad un indirizzo multiplo della sua dimensione Allineato 0 1 2 3 In MIPS, allineamento della parola ad un indirizzo multiplo di 4 (equivale a indirizzo mod 4 = 0) Half word (16 bit) allineata ai multipli di 2 Non allineato La mancanza di allineamento causa un incremento della complessità dell hardware ed un numero maggiore di accessi in memoria Terminologia delle sequenze di bit di particolare lunghezza 4 bit: nibble 8 bit: byte 16 bit: half-word 32 bit: word 64 bit: double-word Valeria Cardellini 19
Istruzione di trasferimento dati MIPS fornisce due istruzioni di base per il trasferimento di dati tra registri del processore e memoria lw (load word): per trasferire una parola di memoria in un registro del processore sw (store word): per trasferire il contenuto di un registro del processore in una parola di memoria Le istruzioni lw e sw richiedono come argomento l indirizzo della locazione di memoria sulla quale devono operare Valeria Cardellini 20 Istruzioni load e store L istruzione di load trasferisce una copia dei dati contenuti in una specifica locazione di memoria ai registri del processore, lasciando inalterata la parola di memoria Il processore invia l indirizzo della locazione desiderata alla memoria e richiede un operazione di lettura del suo contenuto La memoria effettua la lettura dei dati memorizzati all indirizzo specificato e li invia al processore L istruzione di store trasferisce il contenuto di un registro del processore in una specifica locazione di memoria, sovrascrivendo il contenuto precedente di quella locazione Il processore invia l indirizzo della locazione desiderata alla memoria insieme ai dati che vi devono essere scritti, e richiede un operazione di scrittura La memoria effettua la scrittura dei dati all indirizzo specificato Valeria Cardellini 21 Istruzione lw In MIPS, l istruzione lw ha tre argomenti Il registro destinazione in cui caricare la parola letta dalla memoria Una costante o spiazzamento (offset) Un registro base (base register) che contiene il valore dell indirizzo base (base address) da sommare all offset Indirizzamento registro base (o con spiazzamento) L indirizzo della parola di memoria da caricare nel registro è ottenuto sommando il contenuto del registro base alla costante Esempio lw $s1, 100($s2) # $s1 = M[$s2+100] Al registro destinazione $s1 è assegnato il valore contenuto all indirizzo di memoria ($s2+100) Istruzione sw In MIPS, l istruzione sw ha tre argomenti, analogamente all istruzione lw Il registro sorgente, il cui contenuto deve essere scritto in memoria Una costante o spiazzamento (offset) Un registro base (base register) che contiene il valore dell indirizzo base (base address) da sommare all offset Indirizzamento registro base (o con spiazzamento) L indirizzo della parola di memoria da sovrascrivere è ottenuto sommando il contenuto del registro base alla costante Esempio sw $s1, 100($s2) # M[$s2+100] = $s1 Alla locazione di memoria di indirizzo ($s2+100) è assegnato il valore contenuto nel registro sorgente $s1 Valeria Cardellini 22 Valeria Cardellini 23
Istruzioni lw e sw: esempio di compilazione Codice C: A[12] = h+a[8]; Supponiamo che: La variabile h è associata al registro $s2 L indirizzo del primo elemento dell array (base address) è contenuto nel registro $s3 Strutture dati (ad es. array) sono allocate in memoria Codice MIPS: lw $t0, 32($s3) add $t0, $s2, $t0 sw $t0, 48($s3) # $t0=m[$s3+32] # $t0=$s2+$t0 # M[$s3+48]=$t0 Valeria Cardellini 24 Array: esempio Codice C: g = h+a[i]; Supponiamo che: A è un array di 100 word Le variabili g, h e i sono associate rispettivamente ai registri $s1, $s2 e $s4 L indirizzo del primo elemento dell array (base address) è contenuto nel registro $s3 L elemento i-esimo dell array sarà nella locazione di memoria di indirizzo ($s3 + 4*i) i è l indice dell array ad alto livello Il fattore 4 dipende dall indirizzamento della memoria nel MIPS A[0] $s3 A[1] $s3+4 A[2] $s3+8. Valeria Cardellini 25 Array: esempio (2) Codice MIPS: Caricamento dell indirizzo di A[i] nel registro temporaneo $t1 add $t1, $s4, $s4 add $t1, $t1, $t1 add $t1, $t1, $s3 Trasferimento di A[i] nel registro temporaneo $t0 lw $t0, 0($t1) # $t0=a[i] Somma tra h e A[i] e risultato in g add $s1, $s2, $t0 # $t1=2*i # $t1=4*i # $t1=ind di A[i] # g=h+a[i] Register spilling In genere i programmi usano più variabili di quanti sono i registri del processore Il compilatore cerca di mantenere le variabili usate più frequentemente nei registri e le altre variabili in memoria, usando istruzioni di load/store per trasferire le variabili tra registri e memoria Il tempo di accesso ai registri è minore del tempo di accesso alla memoria La tecnica di mettere le variabili meno usate (o usate successivamente) in memoria viene detta register spilling Valeria Cardellini 26 Valeria Cardellini 27
Rappresentazione dei registri Una convenzione per assegnare nomi dei registri e numeri corrispondenti I registri $s0, $s1,, $s7 (detti registri saved) Corrispondono ai registri $16, $17,, $23 I registri $t0, $t1,, $t7 (detti registri temporaries) Corrispondono ai registri $8, $9,, $15 Il registro $zero Corrisponde al registro $0 Contiene sempre il valore 0 Valeria Cardellini 28 Formato istruzioni aritmetiche La rappresentazione binaria di un istruzione assembler è composta da 32 bit (stessa dimensione della parola di memoria) Essa segue il formato di tipo R (istruzione register) per un istruzione logico-aritmetica tra registri Formato istruzioni di tipo R op rs rt rd shamt funct 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit Ai vari campi sono assegnati dei nomi mnemonici op: opcode (codice operativo), indica il tipo di istruzione rs: registro contenente il primo operando sorgente rt: registro contenente il secondo operando sorgente rd: registro destinazione contenente il risultato shamt: shift amount (scorrimento) funct: function, la variante specifica dell operazione indicata nel campo op Valeria Cardellini 29 Istruzioni di tipo R: esempio op rs rt rd shamt funct 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit add $t0, $s1, $s2 non usato 0 17 18 8 0 32 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit 000000 10001 10010 01000 00000 100000 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit Valeria Cardellini 30 Formato istruzioni di tipo I Il formato di tipo R non è adatto a rappresentare istruzioni di tipo load/store All offset sarebbe riservato un campo di 5 bit (al massimo costanti di dimensione pari a 32) Si usa un formato diverso, detto di tipo I (istruzione immediate), sempre di 32 bit Formato istruzioni di tipo I op rs rt address 6 bit 5 bit 5 bit 16 bit Significato dei campi op: opcode, indica il tipo di istruzione rs: registro base rt: registro destinazione (load) o sorgente (store) address: spiazzamento (±2 15 byte o 2 13 parole rispetto all indirizzo indicato dal registro base) Valeria Cardellini 31
Istruzioni di tipo I: esempio op rs rt address 6 bit 5 bit 5 bit 16 bit lw $t0, 1000($s3) 35 19 8 1000 6 bit 5 bit 5 bit 16 bit 100011 10011 01000 0000001111101000 6 bit 5 bit 5 bit 16 bit La memorizzazione del programma: esempio Codice C: A[300] = h+a[300]; Codice MIPS: lw $t0, 1200($t1) add $t0, $s2, $t0 sw $t0, 1200($t1) Assumendo che: $t1 è il registro base $s2 corrisponde a h 35 9 8 1200 0 18 8 8 0 32 43 9 8 1200 Valeria Cardellini 32 Traducendo da decimale a binario si ottiene la rappresentazione binaria del programma Valeria Cardellini 33 Uso alternativo dell indirizzamento con spiazzamento L indirizzamento con spiazzamento prevede l uso di Indirizzo base contenuto nel registro base Spiazzamento specificato nell istruzione tramite una costante Esempio: lw $t0, 16($s0) Se $s0=100, in $t0 viene caricata la parola di memoria di indirizzo 116 In alternativa, si può invertire l uso del registro e della costante Indirizzo base specificato nell istruzione tramite una costante Spiazzamento contenuto nel registro indice (detto in precedenza registro base) Detto indirizzamento indicizzato o indicizzazione Esempio: lw $t0, 100($s0) Se $s0=16, in $t0 viene caricata la parola di memoria di indirizzo 116 I due usi dell indirizzamento con spiazzamento sono equivalenti? Valeria Cardellini 34 Uso alternativo dell indirizzamento con spiazzamento (2) La scelta di porre l indirizzo base nel registro (anziché nella costante) Permette di utilizzare 32 bit per indicare la locazione di inizio Quindi di accedere a tutta la memoria Viceversa, ponendo l indirizzo base nella costante Si possono utilizzare solo 16 bit per indicare la locazione di inizio (vedi formato delle istruzioni di tipo I) La scelta di porre lo spiazzamento nel registro Permette di scorrere l array incrementando l indice Da qui il nome di indirizzamento indicizzato e registro indice Valeria Cardellini 35