Lezione 15 Il Set di Istruzioni (1) Vittorio Scarano Architettura Corso di Laurea in Informatica Università degli Studi di Salerno Un quadro della situazione Input/Output Sistema di Interconnessione Registri Central Processing Unit Principale Unità Aritmetico Logica Interconnessione interna alla Cosa abbiamo fatto circuiti combinatori e sequenziali Dove stiamo andando.. il set di istruzioni Perché: per poter comprendere il funzionamento e poter progettare la Unità di Controllo Unità di Controllo 2 1
Organizzazione della lezione La programmazione dei calcolatori Alcuni principi progettuali Introduzione al linguaggio macchina MIPS operazioni operandi Operazioni aritmetiche (add e sub) di trasferimento dati (lw e sw) Indirizzamento indicizzato della memoria 3 La programmazione dei calcolatori Storia programmazione attraverso numeri binari attività tediosa e lunga facile fare un errore 000111001001001001010010010000100100010010111 linguaggio assembly l assemblatore lo traduce in codice macchina dalla forma simbolica della istruzione machina......al corrispondente formato binario linguaggi ad alto livello compilatore lo traduce in assembly 4 2
Un esempio: C=A+B linguaggio ad alto livello add $t0, $s0, $s1 assembly 1000110010100000 linguaggio macchina 5 I benefici dei linguaggi ad alto livello Notazione naturale vicina al linguaggio corrente e alla notazione algebrica Incremento di produttività Indipendenza dalla architettura (processore) su cui il programma va eseguito Permette l uso di librerie di funzionalità già scritte (riuso del codice) 6 3
I benefici del linguaggio assemblatore La dipendenza dal processore permette: programmi più efficienti programmi (potenzialmente) più compatti Importante per: programmazione di controller di processi e macchinari (anche real-time) programmazione di apparati limitati: Portable Devices Telefonini cellulari etc.etc. 7 La compilazione: linguaggio C I compiti del compilatore e del linker hello.c #include <stdio.h>... file /* Prototipi funzioni */ stdio.h compilatore oggetto Libreria di Funzioni I/O standard linker a.out file eseguibile gcc hello.c Interfaccia alla libreria di funzioni I/O standard 8 4
Il processo della compilazione Programma C hello.c compilatore Programma in linguaggio assemblatore assemblatore Programma in linguaggio macchina a.out Il compilatore di norma comprende l assemblatore L assembler: permette l uso di pseudoistruzioni Il caricatore (loader) carica il programma in memoria caricatore Programma in memoria 9 La compilazione: il linguaggio Java Hello.java Hello.class... compilatore javac Hello.java... Java Virtual Machine java Hello 10 5
Java: la macchina virtuale Un programma che esegue programmi Java Virtual Machine Hello.class 11 Alcuni principi Le istruzioni vengono rappresentate da numeri i programmi vengono immagazzinati in memoria insieme ai dati Storicamente: architettura introdotta dall EDVAC opposta alla Harvard architecture che aveva spazi di memoria diversi per dati e programmi 12 6
Il linguaggio del calcolatore Linguaggio macchina: composto di istruzioni che compongono l insieme delle istruzioni I principi della progettazione: Obiettivi: un linguaggio macchina che renda facile la costruzione della macchina semplicità per il progettista che renda facile la costruzione dei compilatori offerta delle operazioni più comuni che ottimizzi i costi di produzione che permetta prestazioni alte competitività sul mercato 13 La semplicità della realizzazione Principio guida per tutti i calcolatori dagli anni cinquanta ad oggi Semplice significa economico ( semplicità = regolarità ) affidabile di facile apprendimento ed uso (programmatori) di facile traduzione (compilatori) 14 7
Le operazioni e gli operandi Processore MIPS (tipica architettura) Operazioni di tipo diverso: operazioni aritmetiche operazioni di trasferimento (memoria registri) operazioni di scelta e controllo del flusso operazioni di supporto alle procedure Operandi: accesso ai registri della macchina accesso alla memoria uso di costanti 15 Operazioni aritmetiche Fondamentali: le informazioni sono codificate in dati i dati sono rappresentati da numeri Un esempio: per compiere a=b+c e a=b-c Alcuni commenti: add a, b, c struttura fissa a 3 operandi la semplicità favorisce la regolarità sub a, b, c 16 8
Il prezzo della semplicità Per compiere a=b+c+d+e add a, b, c add a, a, d add a, a, e Per sommare 4 variabili (b,c,d,e) in a servono 3 istruzioni Commenti: su ogni linea, preceduti da # # calcolo a=b+c # calcolo a=(b+c)+d # calcolo a=(b+c+d)+e 17 Gli operandi A differenza dei linguaggi ad alto livello: gli operandi devono provenire da locazioni particolari di memoria dette registri Nei linguaggi ad alto livello non ci si preoccupa: del numero e del tipo di variabili della quantità di memoria utilizzata di dover portare i dati dalla memoria ai registri e dai registri alla memoria è compito del compilatore inserire le istruzioni necessarie 18 9
I registri Dimensione di un registro MIPS 32 bit (detta parola) Le caratteristiche dei registri: alta velocità di accesso limitati in numero (32 registri) ($0, $1,..$31) Convenzione MIPS: registri rappresentati da: $s0, $s1,..., i registri che contengono variabili $t0, $t1,..., i registri di uso temporaneo Altro principio di progettazione: piccolo = veloce (clock) 19 Il ruolo del compilatore Assegnare variabili a registri f = ( g + h ) - ( i + j ) add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1 f $s0 g $s1 h $s2 i $s3 j $s4 # g+h # i+j # f = (g+h)-(j+j) 20 10
Le operazioni e gli operandi Operazioni di tipo diverso: operazioni aritmetiche operazioni di trasferimento (memoria registri) operazioni di scelta e controllo del flusso operazioni di supporto alle procedure Operandi: accesso ai registri della macchina accesso alla memoria uso di costanti 21 Istruzioni trasferimento dati: perchè? registri $0 $1 $2.. $31 Il numero limitato di registri rende possibile la realizzazione della velocizza il clock..ma rende necessario introdurre istruzioni per trasferire il contenuto dei registri in memoria e viceversa.. 22 11
La registri $0 $1 $2.. $31.. 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 Permette l accesso alle locazioni fornendo l indirizzo Come un array monodimensionale, indicizzato tramite l indirizzo 23 Indirizzamento della registri $0 $1 $2 $31 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 E possibile l indirizzamento al byte per motivi di efficienza Indirizzamento di una parola è legato a 4 byte quindi gli indirizzi delle parole differiscono di 4 24 12
Istruzioni di trasferimento dati: la load-word 1000 1001 lw $8, 1000($19) $8 $19 3127 3127 1002 1003 1004 1005 1006 1007 1008 1009 1010 Indirizzamento indicizzato nel registro $8 va caricato l elemento con indirizzo uguale a 1000 + il valore in $19 Uso di un registro indice 4 1011 1012 1013 1014 1015 25 Il ruolo del registro indice $8 1237 3127 4125 $19 04 8 1237 3127 4125 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 lw $8, 1000($19) Utile per scorrere array al variare di $19 Attenzione! Il registro indice deve sempre variare di 4 in 4 1013 1014 1015 26 13
Istruzione di trasferimento dati: la store-word 1000 1001 sw $8, 1000($19) $8 $19 3127 4 3127 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 Indirizzamento indicizzato l elemento nel registro $8 va memorizzato nel.. l elemento con indirizzo uguale a 1000 + il valore in $19 Uso di un registro indice 1014 1015 27 Un programma di esempio (1) 1000 1001 $8 $18 $19 3127 13 4 3127 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 lw $8, 1000($19) add $8, $18, $8 sw $8, 1000($19) 1015 28 14
Un programma di esempio (2) $8 $18 $19 3127 3140 + 13 4 3127 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 lw $8, 1000($19) add $8, $18, $8 sw $8, 1000($19) 29 Un programma di esempio (3) $8 $18 $19 3140 13 4 3127 3140 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 lw $8, 1000($19) add $8, $18, $8 sw $8, 1000($19) 30 15
Alcuni commenti Le istruzioni di trasferimento dati prevedono: accesso al byte accesso a 2 byte (halfword) accesso alla parola (word) Di norma, si usano etichette (label) per indicare l indirizzo di partenza dell array: lw $8, AStart($19) 31 Esercizi Come si fa a realizzare la istruzione (C) g = h + A[i]? (Vedere esempi a pag. 95) Scrivere un programma che, assumendo di avere dei valori nei registri $s0, $s1 e $s2 scriva nella parola con indirizzo 1000 la somma dei tre registri. Scrivere un programma che, assumendo di avere nel registro $s0 il valore 10, nel registro $1 il valore 4, nel registro $2 il valore 3, scriva nelle parole con indirizzo 1000, 1004, 1008, rispettivamente il valore 10, 13 e 16. 32 16
Problemi Che tipo di indirizzamento dovremmo avere a disposizione per poter fare a meno dell'indirizzamento indicizzato? Perché le istruzioni di trasferimento dati lw e sw prevedono un metodo di indirizzamento dati indicizzato? Non sarebbe stato più facile prevedere un indirizzamento "diretto" vale a dire specificare direttamente la locazione di memoria da cui (o verso cui) prelevare (o scrivere) il dato di un registro? 33 17