Calcolatori elettronici
Architettura set di istruzioni
Un tema comune nella descrizioni del software e dell’hardware è il fatto che man mano che si
scava in profondità nelle specifiche si trovano sempre maggiori informazioni e, viceversa,
dettagli di livello inferiori sono nascosti al fine di offrire un modello più semplice ai livelli
superiori. L’uso di tali livelli, o astrazioni, è la principale tecnica utilizzata nel progetto di sistemi
di calcolo estremamente sofisticati. Uno dei livelli di astrazione più importanti corrisponde
all’interfaccia tra hardware e software di più basso livello, a cui viene associato il nome di:
Architettura Del Set Di Istruzioni. Include tutto ciò che i programmatori devono conoscere per
creare un programma in linguaggio macchina correttamente funzionante e quindi: le istruzioni, i
dispositivi I/O, ecc…Questa interfaccia standard permette ai progettisti di parlare di funzioni
indipendentemente dall’hardware.
Istruzioni nel linguaggio dei calcolatori
Qualsiasi calcolatore deve conoscere le operazioni aritmetiche. La notazione del linguaggio
MIPS è:
add a, b, c # a = b + c
Questa notazione è rigida, ovvero, ogni istruzione aritmetica MIPS esegue una sola operazione
e contiene esattamente tre variabili. Il numero di operandi più naturale per un’operazione come
Calcolatori elettronici 1
la somma è pari a tre: i 2 numeri da sommare ed il riferimento alla locazione in cui memorizzare
il risultato. Il fatto di richiedere che tutte le istruzioni abbiano esattamente tre operandi è
conforme alla filosofia di mantenere l’hardware semplice; ciò ricade nel primo principio per la
progettazione hardware:
Semplicità e regolarità sono strettamente collegate.
A differenza di altri linguaggi, le variabili utilizzate in MIPS sono registri. Nell’architettura MIPS i
registri occupano 32 bit, gruppi da 32 bit formano una word. I registri all’interno di un
calcolatore con questa architettura sono 32. La ragione per la limitazione ai 32 registri è
conforme al secondo principio:
Minori sono le dimensioni, maggiore è la velocità.
Un numero elevato di registri comporterebbe una durata maggiore del ciclo di clock a causa
dell’elettronica montata sui calcolatori. Questo però non è sempre vero; difatti 31 registri
potrebbero non essere meglio di 32; per questo i progettisti devono cercare dei compromessi
tra possibilità di avere più registri a discapito della velocità del ciclo di clock.
Le strutture dati vengono allocate in memoria, per questo esistono istruzioni di trasferimento
dati che permettono di passare dati da registro a memoria o viceversa.
lw $t0, offset($t1) # carica in t0 il contenuto della cella corrisponde
nte a # indirizzo puntato da $t1 + offs
et(in byte)
VINCOLO DI ALLINEAMENTO
Dal momento che i byte (8 bit) sono usati in molti programmi, la maggior parte delle
architetture indirizza il singolo byte, quindi l’indirizzo di una word corrisponde all’indirizzo
di uno dei 4 byte che la compongono. L’indirizzo di word consecutive differisce quindi di 4
byte. In MIPS le parole iniziano sempre a multipli di 4, questo requisito si chiama “vincolo di
allineamento”. I calcolatori con indirizzamento relativo al singolo byte si dividono tra quelli
che utilizzano il byte più a destra e quelli che utilizzano il byte più a sinistra. Il MIPS fa parte
della prima categoria detta anche big-end.
L’indirizzamento a byte influisce anche gli indici dei vettori: per ottenere l’indirizzo corretto
in byte se si vuole accedere all’indice 2 di un vettore sarà: 4 * 2 = 8.
lw $t0, 8($t1)
L’istruzione per salvare in memoria è chiamata store e funziona dualmente alla load world.
SPILLING
Calcolatori elettronici 2
Molti programmi contengono più variabili dei registri a disposizione; di conseguenza il
compilatore cerca di mantenere nei registri le variabili usate più frequentemente e pone le
restanti in memoria, utilizzando istruzioni di trasferimento dati per spostare le variabili fra
registri e memoria. Il processo di allocare in memoriale variabili usate meno
frequentemente o usate in fasi successive si chiama “spilling” dei registri.
Campi delle istruzioni
A ciascuno dei campi delle istruzioni MIPS viene associato un nome:
NOMI CAMPI
OP: indica il codice operativo.
RS: primo registro sorgente.
RT: secondo registro sorgente.
RD: registro destinazione.
SHAMT: shift amount per istruzioni logiche.
FUNCT: variante op.
R-type:
OP (6bit) RS (5bit) RT (5bit) RD (5bit) SHAMT (5bit) FUNCT (5bit)
Può nascere un problema quando un’istruzione necessita di campi di dimensioni maggiori
rispetto a quelle sopra indicate. Le istruzioni di trasferimento dati devono specificare due
registri e una costante; se la costante dovesse essere messa in un campo a 5 bit avrebbe come
dimensione massima . Spesso però deve assumere valori maggiori, quindi si sfrutta un altro
5
2
principio della progettazione per adattare questo tipo di istruzioni:
Un buon progetto richiede buoni compromessi.
Il compromesso scelto è quello di predisporre un altro formato per questo tipo di istruzioni:
I-type:
OP (6bit) RS (5bit) RT (5bit) ADDRESS (16bit)
Il campo ADDRESS consente di avere uno spostamento con range byte, o word
15 13
±2 ±2
rispetto all’indirizzo di base RS.
Istruzioni per prendere decisioni
Calcolatori elettronici 3
Sono presenti istruzioni di salto condizionato, e sono rappresentate con:
beq $t0, $t1, L1 # salta all'etichetta L1 se t0 = t1
bne $t0, $t1, L1 # salta all'etichetta L1 se t0 != t1
I test per verificare l’uguaglianza o la diseguaglianza fra due variabili sono gestiti da una
istruzione che confronta due registri e pone un terzo registro pari a 1 se il primo è minore del
secondo, 0 se è maggiore.
slt $t0, $t1, $t2
Il costrutto Switch si basa sulla creazione di una tabella contenente gli indirizzi di salto ed è
creato in due modi:
#Programma che prova il funzionamento
#del costrutto case switch.
#1^ soluzione per costruire la tabella
#degli indirizzi di salto con le
#istruzioni, quindi in fase di esecuzione
.data 0x10010000
tab_ind: .space 8 # allocazione spazio per 2 word
.text 0x400000
c0: nop
nop
j c0
c1: nop
nop
j c1
.text 0x400100
la $t0, tab_ind # carico indirizzo area dati per la tabella degli i
ndirizzi
Calcolatori elettronici 4
la $t1, c0 # carico l'indirizzo di c0 in t1
sw $t1, ($t0) # carico nella prima riga della tabella degli indiriz
zi l'indirizzo di c0
la $t2, c1 # come sopra per c1
sw $t2, 4($t0)
.text 0x400200
li $s0, 1 # carico il numero del case a cui voglio accedere
sll $s0, $s0, 2 # moliplico per 4 il numero per il vincolo di allin
eamento
add $t0, $t0, $s0 # sommo all'indirizzo della tabella degli indiriz
zi il numero così da ottenere
la posizione del case a cui voglio accedere
lw $s1, ($t0) # carico il case in un registro
jr $s1 # accedo al case tramite salto al registro
#Programma che prova il funzionamento
#del costrutto case switch.
#2^ soluzione per costruire la tabella
#degli indirizzi di salto con la
#direttiva .word.
#Inoltre usa la direttiva .globl per
#impostare in automatico in SPIM il PC
#e facilitare l'inserimento dei break point
.data 0x10010000
tab_ind: .word c0, c1 # scrittura tabella indirizzi dall' indirizzo
Calcolatori elettronici 5
0x10010000
.text 0x400000
# definizioni globl per permettere a tutto il programma di vedere i
case .globl __start
.globl c0
.globl c1
c0: nop
nop
j c0
c1: nop
nop
j c1
.text 0x400100
__start:
la $t0, tab_ind # carico indirizzo area dati per la tabella degli i
ndirizzi
li $s0, 1 # carico il numero del case a cui voglio accedere
sll $s0, $s0, 2 # moliplico per 4 il numero per il vincolo di allin
eamento
add $t0, $t0, $s0 # sommo all'indirizzo della tabella degli indiriz
zi il numero così da ottenere
la posizione del case a cui voglio accedere
lw $s1, ($t0) # carico il case in un registro
jr $s1 # accedo al case tramite salto al registro
Il formato utilizzato da queste istruzioni è I-type.
Calcolatori elettronici 6
Gestione delle procedure
Una procedura è uno strumento che i programmatori usano per strutturare i programmi per
renderli più leggibili e per riutilizzare il codice. MIPS alloca i seguenti registri per le procedure:
$a0, …, $a3: passaggio parametri.
$v0, $v1: restituzione risultati.
$ra: ritorno al chiamante.
Viene introdotta una nuova istruzione per le procedure:
jal indirizzoProcedura
Jal alla sua chiamata, salva in $ra l’indirizzo di ritorno identificato dal valore: PC+4.
Supponendo che si necessitino più registri in una procedura di quanti ne siano rimasti, si
ricorre all’utilizzo dello stack per riversare e ripristinare i registri una volta terminato il loro
utilizzo nella procedura. Lo stack
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti Calcolatori Elettronici
-
Appunti lezione Calcolatori elettronici
-
Appunti lezione Calcolatori elettronici
-
Appunti Calcolatori elettronici - parziale