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