L`insieme delle istruzioni La programmazione dei calcolatori

La programmazione dei calcolatori
• Linguaggio macchina (codifica con numeri binari)
– Linguaggio direttamente comprensibile dal calcolatore
– Attività di programmazione lunga e noiosa
– Facile commettere errori
L’insieme delle istruzioni
• 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
Architetture dei Calcolatori
(lettere A-I)
• Linguaggi ad alto livello
– Tradotti dal compilatore in assembler
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Vantaggi e svantaggi dell’assembler
Benefici dei linguaggi ad alto livello
• Vantaggio: la dipendenza dall’architettura del calcolatore
permette
• 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
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, …)
• Indipendenza dalle caratteristiche peculiari
dell’architettura (processore) su cui il programma va
eseguito (portabilità)
• Principali svantaggi della programmazione
– 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
1
2
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
1
Il processo di compilazione
Compilazione
Programma sorgente
• 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)
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
4
5
Il processo di compilazione (2)
Il linker
Programma sorgente
• Il linker (link editor o collegatore) ha il compito di
collegare tra loro vari moduli che compongono lo stesso
programma
compilatore
– Programma sorgente suddiviso in più file che vengono
compilati separatamente creando diversi file oggetto
– Utilizzo di funzioni di libreria
Programma in linguaggio assembler
assemblatore
• 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
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Oggetto: modulo in
linguaggio macchina
Oggetto: libreria di
funzioni
linker
6
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Eseguibile: programma
in linguaggio macchina
caricatore
Programma in memoria
7
2
Alcuni principi progettuali
I principi della progettazione
• Le istruzioni sono codificate in forma binaria
• I programmi vengono immagazzinati in memoria
insieme ai dati
• L’obiettivo è avere un set di istruzioni che
– Faciliti la costruzione della macchina
• Semplicità per il progettista
– 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
– Faciliti la costruzione dei compilatori
– Ottimizzi i costi di produzione
– Permetta prestazioni elevate
• Competitività sul mercato
• Solo l’interpretazione da parte del processore stabilisce se una
data configurazione di bit è da considerarsi come un dato o
un’istruzione
• Principio della semplicità della realizzazione: semplice
significa
• 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
Architettura MIPS
Architetture dei Calcolatori 2004/05
Valeria Cardellini
• Le informazioni sono codificate in dati
• I dati sono rappresentati da numeri
• Esempio
– Progettata nei primi anni ’80
– Prodotta e sviluppata da MIPS Technologies negli anni ’90
(http://www.mips.com)
– Per effettuare a=b+c e a=b-c
add a, b, c sub a, b, c
• 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
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)
• Rappresenta un buon modello architetturale per la
didattica, perché è un’architettura semplice da
comprendere
Architetture dei Calcolatori 2004/05
Valeria Cardellini
9
Operazioni aritmetiche
• Sviluppata e progettata a Stanford (USA)
–
–
–
–
–
–
economico (semplicità = regolarità)
affidabile
di facile apprendimento ed uso (per i programmatori)
di facile traduzione (per i compilatori)
10
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
3
I registri
Gli operandi
• Il livello ISA dell’architettura MIPS richiede che
• A differenza dei linguaggi ad alto livello, gli operandi
devono provenire da speciali locazioni di memoria
all’interno del processore, dette registri
– Gli operandi delle istruzioni provengano dai registri
– Architettura di tipo load-store (o registro-registro)
• Il processore possiede un numero limitato di registri
– Nei linguaggi ad alto livello non ci si preoccupa di dover portare
i dati dalla memoria ai registri e dai registri alla memoria
– 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
• E’ compito del compilatore inserire le istruzioni necessarie
• Caratteristiche dei registri
– Elevata velocità di accesso
– In numero limitato
• Per convenzione, per denotare i registri si usano nomi
simbolici preceduti da $
• Convenzione MIPS per rappresentare i registri:
• Altro principio progettuale: “piccolo = veloce”
– Usando 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)
• 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
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Le operazioni e gli operandi
Il ruolo del compilatore
• Le istruzioni MIPS consentono operazioni di tipo diverso
classificabili nelle quattro categorie
• 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
• Il compilatore introduce due variabili temporanee (t0
e t1) che associa a due registri temporanei $t0 e $t1
# i+j
sub $s0, $t0, $t1
# f = (g+h)-(i+j)
Architetture dei Calcolatori 2004/05
Valeria Cardellini
• Necessarie due modalità di trasferimento tra memoria e registri
del processore
– Load (caricamento) o read (lettura)
– Store (memorizzazione) o write (scrittura)
# g+h
add $t1, $s3, $s4
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
– Ad esempio, alle variabili f, g, h, i e j sono associati i registri
$s0, $s1, $s2, $s3 e $s4
add $t0, $s1, $s2
13
– Uso di costanti
14
Architetture dei Calcolatori 2004/05
Valeria Cardellini
15
4
Istruzioni aritmetiche-logiche
Indirizzamento della memoria nel MIPS
• 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
.
.
.
12
.
.
.
$0
8
4
0
– 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
• 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)
$1
.
.
.
$31
Memoria
Processore
• Esempio: istruzione sub
• Per motivi di efficienza, è
possibile l’indirizzamento a
livello dei singoli byte che
compongono una parola
– 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
• L’accesso è generalmente con indirizzamento del byte
0
• Esistono due convenzioni per ordinare i byte all’interno di
una parola (endianess)
Allineato
– 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
2
1
0
7
6
5
4
0
4
0
1
2
3
4
5
6
7
Word
Big Endian
2
3
• In MIPS, allineamento della parola ad
un indirizzo multiplo di 4 (equivale a
indirizzo mod 4 = 0)
Word
18
• 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
– 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
1
– Half word (16 bit) allineata ai multipli di 2
Non allineato
Byte
Byte
17
• L’allineamento richiede che la parola inizi ad un indirizzo
multiplo della sua dimensione
– L’indirizzo di una parola corrisponde all’indirizzo di uno dei byte
all’interno della parola
3
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Allineamento dei byte e terminologia
Ordinamento dei byte
Little Endian
– Quindi gli indirizzi delle parole
differiscono di 4
– Memoria formata da 230 parole
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
5
Istruzione di trasferimento dati
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
• MIPS fornisce due istruzioni di base per il
trasferimento di dati tra registri del processore e
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
– 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
• 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
• Le istruzioni lw e sw richiedono come argomento
l’indirizzo della locazione di memoria sulla quale
devono operare
– 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
20
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Istruzione lw
Istruzione sw
• In MIPS, l’istruzione lw ha tre argomenti
• In MIPS, l’istruzione sw ha tre argomenti, analogamente
all’istruzione lw
– 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
– 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)
• 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
– L’indirizzo della parola di memoria da sovrascrivere è ottenuto
sommando il contenuto del registro base alla costante
• Esempio
lw $s1, 100($s2)
• Esempio
sw $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
21
# M[$s2+100] = $s1
– Alla locazione di memoria di indirizzo ($s2+100) è assegnato il
valore contenuto nel registro sorgente $s1
22
Architetture dei Calcolatori 2004/05
Valeria Cardellini
23
6
Istruzioni lw e sw: esempio di
compilazione
Array: esempio
• Codice C:
• Supponiamo che:
• Codice C: A[12] = h+A[8];
• 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
– 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)
• 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
.
.
.
# $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
Architetture dei Calcolatori 2004/05
Valeria Cardellini
Array: esempio (2)
• 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
– Caricamento dell’indirizzo di A[i] nel registro temporaneo $t1
# $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)
– Il tempo di accesso ai registri è minore del tempo di accesso
alla memoria
# $t0=A[i]
• La tecnica di mettere le variabili meno usate (o usate
successivamente) in memoria viene detta register
spilling
– Somma tra h e A[i] e risultato in g
add $s1, $s2, $t0
Architetture dei Calcolatori 2004/05
Valeria Cardellini
25
Register spilling
• Codice MIPS:
add $t1, $s4, $s4
g = h+A[i];
# g=h+A[i]
26
Architetture dei Calcolatori 2004/05
Valeria Cardellini
27
7
Formato istruzioni aritmetiche
Rappresentazione dei registri
• 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
• 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
6 bit
• Il registro $zero
– Corrisponde al registro $0
– Contiene sempre il valore 0
28
op
rs
rt
rd
6 bit
5 bit
5 bit
5 bit
6 bit
Valeria Cardellini
5 bit
6 bit
– 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
non usato
17
18
8
0
32
6 bit
5 bit
5 bit
5 bit
5 bit
6 bit
• Formato istruzioni di tipo I
op
rs
rt
6 bit
5 bit
5 bit
5 bit
address
16 bit
• Significato dei campi
000000 10001 10010 01000 00000 100000
5 bit
29
Formato istruzioni di tipo I
shamt funct
0
Architetture dei Calcolatori 2004/05
Valeria Cardellini
5 bit
• Il formato di tipo R non è adatto a rappresentare
istruzioni di tipo load/store
add $t0, $s1, $s2
5 bit
5 bit
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
Istruzioni di tipo R: esempio
5 bit
5 bit
–
–
–
–
–
–
Architetture dei Calcolatori 2004/05
Valeria Cardellini
6 bit
5 bit
• Ai vari campi sono assegnati dei nomi mnemonici
–
–
–
–
6 bit
30
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
8
La memorizzazione del programma:
esempio
Istruzioni di tipo I: esempio
op
rs
rt
6 bit
5 bit
5 bit
address
• Codice C:
16 bit
6 bit
19
8
1000
5 bit
5 bit
16 bit
5 bit
5 bit
• $t1 è il registro base
add $t0, $s2, $t0
sw $t0, 1200($t1)
35
100011 10011 01000 0000001111101000
6 bit
Assumendo che:
• Codice MIPS: lw $t0, 1200($t1)
lw $t0, 1000($s3)
35
A[300] = h+A[300];
16 bit
Architetture dei Calcolatori 2004/05
Valeria Cardellini
32
Uso alternativo dell’indirizzamento
con spiazzamento
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
Uso alternativo dell’indirizzamento
con spiazzamento (2)
• L’indirizzamento con spiazzamento prevede l’uso di
• La scelta di porre l’indirizzo base nel registro (anziché
nella costante)
– Indirizzo base contenuto nel registro base
– Spiazzamento specificato nell’istruzione tramite una costante
– Esempio: lw $t0, 16($s0)
– Permette di utilizzare 32 bit per indicare la locazione di inizio
• Quindi di accedere a tutta la memoria
Se $s0=100, in $t0 viene caricata la parola di memoria di indirizzo 116
• Viceversa, ponendo l’indirizzo base nella costante
• In alternativa, si può invertire l’uso del registro e della
costante
– Si possono utilizzare solo 16 bit per indicare la locazione di inizio
(vedi formato delle istruzioni di tipo I)
– 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)
• 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
• 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
Architetture dei Calcolatori 2004/05
Valeria Cardellini
35
9