L’insieme delle istruzioni Architetture dei Calcolatori (lettere A-I) La programmazione dei calcolatori • 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 1 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) Architetture dei Calcolatori 2004/05 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) Architetture dei Calcolatori 2004/05 Valeria Cardellini 3 2 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) Architetture dei Calcolatori 2004/05 Valeria Cardellini 4 Il processo di compilazione Programma sorgente hello.c compilatore Programma in linguaggio assembler hello.s assemblatore Programma in linguaggio macchina (codice oggetto) 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 caricatore Programma in memoria Architetture dei Calcolatori 2004/05 Valeria Cardellini 5 3 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 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 6 Il processo di compilazione (2) Programma sorgente compilatore Programma in linguaggio assembler assemblatore Oggetto: modulo in linguaggio macchina Oggetto: libreria di funzioni linker Architetture dei Calcolatori 2004/05 Valeria Cardellini Eseguibile: programma in linguaggio macchina caricatore Programma in memoria 7 4 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) Architetture dei Calcolatori 2004/05 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) Architetture dei Calcolatori 2004/05 Valeria Cardellini 9 5 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 Architetture dei Calcolatori 2004/05 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 NB: gli operandi non sono ancora quelli reali • 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à Commento su ogni – Per effettuare f = (g+h)-(i+j) Architetture dei Calcolatori 2004/05 Valeria Cardellini linea preceduto da # add t0, g, h # calcolo t0=g+h add t1, i, j # calcolo t1=i+j sub f, t0, t1 # calcolo f=t0-t1 11 6 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 12 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) Architetture dei Calcolatori 2004/05 Valeria Cardellini 13 7 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 # g+h add $t1, $s3, $s4 # i+j sub $s0, $t0, $t1 # f = (g+h)-(i+j) Architetture dei Calcolatori 2004/05 Valeria Cardellini 14 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 15 8 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 16 Indirizzamento della memoria nel MIPS . . . 12 . . . $0 8 4 0 $1 Memoria . . . $31 Processore Architetture dei Calcolatori 2004/05 Valeria Cardellini • 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 230 parole • Per motivi di efficienza, è possibile l’indirizzamento a livello dei singoli byte che compongono una parola 17 9 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 Indirizzo Little Endian 3 2 1 0 7 6 5 4 0 4 0 1 2 3 4 5 6 7 Big Endian 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 18 Allineamento dei byte e terminologia • L’allineamento richiede che la parola inizi ad un indirizzo multiplo della sua dimensione 0 Allineato 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 4 bit: nibble 8 bit: byte 16 bit: half-word 32 bit: word 64 bit: double-word 19 10 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 Architetture dei Calcolatori 2004/05 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 21 11 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) Architetture dei Calcolatori 2004/05 Valeria Cardellini 22 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 23 12 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) # $t0=M[$s3+32] add $t0, $s2, $t0 # $t0=$s2+$t0 sw $t0, 48($s3) # M[$s3+48]=$t0 Architetture dei Calcolatori 2004/05 Valeria Cardellini 24 Array: esempio • Codice C: • Supponiamo che: g = h+A[i]; – 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 . . . Architetture dei Calcolatori 2004/05 Valeria Cardellini 25 13 Array: esempio (2) • Codice MIPS: – Caricamento dell’indirizzo di A[i] nel registro temporaneo $t1 add $t1, $s4, $s4 # $t1=2*i add $t1, $t1, $t1 # $t1=4*i add $t1, $t1, $s3 # $t1=ind di A[i] – 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 # g=h+A[i] Architetture dei Calcolatori 2004/05 Valeria Cardellini 26 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 27 14 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 Architetture dei Calcolatori 2004/05 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 shamt funct op rs rt rd 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 Architetture dei Calcolatori 2004/05 campo op Valeria Cardellini 29 15 Istruzioni di tipo R: esempio op rs rt rd 6 bit 5 bit 5 bit 5 bit shamt funct 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 Architetture dei Calcolatori 2004/05 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 6 bit 5 bit 5 bit address 16 bit • Significato dei campi – – – – op: opcode, indica il tipo di istruzione rs: registro base rt: registro destinazione (load) o sorgente (store) address: spiazzamento (±215 byte o 213 parole rispetto all’indirizzo indicato dal registro base) Architetture dei Calcolatori 2004/05 Valeria Cardellini 31 16 Istruzioni di tipo I: esempio op rs rt 6 bit 5 bit 5 bit address 16 bit lw $t0, 1000($s3) 35 6 bit 19 8 1000 5 bit 5 bit 16 bit 100011 10011 01000 0000001111101000 6 bit 5 bit 5 bit 16 bit Architetture dei Calcolatori 2004/05 Valeria Cardellini 32 La memorizzazione del programma: esempio • Codice C: A[300] = h+A[300]; Assumendo che: • Codice MIPS: lw $t0, 1200($t1) • $t1 è il registro base add $t0, $s2, $t0 sw $t0, 1200($t1) 35 9 8 0 18 8 43 9 8 Architetture dei Calcolatori 2004/05 Valeria Cardellini • $s2 corrisponde a h 1200 8 0 32 1200 Traducendo da decimale a binario si ottiene la rappresentazione binaria del programma 33 17 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? Architetture dei Calcolatori 2004/05 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 Architetture dei Calcolatori 2004/05 Valeria Cardellini 35 18