1. MIPS & SPIM
MIPS & SPIM
Modulo del Corso di Architettura degli Elaboratori
Nicola Paoletti
Universit` di Camerino
a
Scuola di Scienze e Tecnologie
12 Aprile 2011
AA 2010/2011
2. MIPS & SPIM
Lezioni precedenti
Lezione 1: linguaggio macchina/assembly/alto livello; RISC
vs CISC.
Lezione 2: Introduzione al MIPS Instruction Set; registri;
istruzioni aritmetiche e di data transfer.
Lezione 3: Codifica delle istruzioni (R-type, I-type, J-type).
3. MIPS & SPIM
Organizzazione della memoria
Riepilogo
1 Organizzazione della memoria
2 Struttura di un programma MIPS
3 Esercizi
4. MIPS & SPIM
Organizzazione della memoria
Suddivisione della memoria (1/3)
5. MIPS & SPIM
Organizzazione della memoria
Suddivisione della memoria (2/3)
Segmento di testo
(0x400000-0x10000000): memorizza il
codice (le istruzioni) del programma
Segmento di dato (0x10000000-a):
suddiviso in
dati statici: contengono gli
oggetti di dimensione nota al
compilatore, la cui vita ` l’intera
e
durata di esecuzione del
programma
dati dinamici: sono i dati allocati
a run-time; tale segmento pu` o
espandersi verso l’alto per
soddisfare le richieste del
programma
6. MIPS & SPIM
Organizzazione della memoria
Suddivisione della memoria (3/3)
Segmento di testo
(0x400000-0x10000000)
Segmento di dato (0x10000000-a)
Segmento di stack (b-0x7fffffff): di
dimensione variabile; si espande verso il
basso.
Naturalmente deve valere: a ≤ b
7. MIPS & SPIM
Organizzazione della memoria
Stack frame
$fp (frame pointer) punta
alla prima parola del frame;
$sp (stack pointer) punta
all’ultima parola dello stack
Lo stack si espande verso il
basso, quindi l’indirizzo
puntato da $sp ` minore di
e
quello puntato da $fp
8. MIPS & SPIM
Organizzazione della memoria
Stack frame - Chiamate a procedura (1/3)
Fase 1. Il programma chiamante inizializza lo
stack
1 Passa gli argomenti. I primi 4 sono memorizzati
in $a0-$a3, i restanti all’inizio dello stack
2 Salva i registri di competenza del chiamante
3 Esegue un’istruzione $jal (jump and link), che
salta alla prima istruzione del programma
chiamato e salva l’indirizzo di ritorno in $ra
($31)
9. MIPS & SPIM
Organizzazione della memoria
Stack frame - Chiamate a procedura (2/3)
Fase 2. Il programma chiamato inizializza il
suo stack frame
1 Alloca lo stack frame: $sp = $sp -
dimensione frame
2 Salva i registri di competenza del chiamato. In
particolare salva $s0 - $s7, $fp e $ra prima di
modificarli, dato che il chiamante si aspetta di
trovarli inalterati
3 Inizializza il frame pointer: $fp = $sp +
dimensione frame - 4
10. MIPS & SPIM
Organizzazione della memoria
Stack frame - Chiamate a procedura (3/3)
Fase 3. Il programma chiamato restituisce il
controllo al chiamante
1 Salva eventuali valori di ritorno in $v0
2 Ripristina i registri salvati
3 Libera lo stack frame: $sp = $sp +
dimensione frame
4 Restituisce il controllo, facendo un salto
all’indirizzo in $ra
11. MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (1/4)
main ( )
{
printf (” I l fattoriale d i 10 e ’ %dn” , f a c t ( 1 0 ) ) ;
}
int fact ( int n)
{
i f ( n < 1)
return 1;
else
r e t u r n n∗ f a c t ( n − 1 ) ;
}
Listing 1: Fattoriale in C
12. MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (2/4)
.text
. g l o b l main
main :
subu $sp , $sp , 3 2 #Lo S t a c k f r a m e e ’ g r a n d e 32 b y t e s
sw $ra , 2 0 ( $sp ) #S a l v a l ’ i n d i r i z z o d i r i t o r n o
sw $fp , 1 6 ( $sp ) #S a l v a i l v e c c h i o f r a m e p o i n t e r
a d d i u $fp , $sp , 2 8 #I n i z i a l i z z a i l frame p o i n t e r
l i $a0 , 1 0 #Me tte l ’ argom e nto ( 1 0 ) i n $a0
ja l fact #Chiama l a f u n z i o n e f a t t o r i a l e
l a $a0 , $LC #Me tte i n $a0 l a v a r i a b i l e s t r i n g a $LC
move $a1 , $v0 #S p o s t a i l r i s u l t a t o d i f a c t i n $a1
jal printf #Chiama l a f u n z i o n e p r i n t f
l w $ra , 2 0 ( $sp ) #R i p r i s t i n a l ’ i n d i r i z z o d i r i t o r n o
l w $fp , 1 6 ( $sp ) #R i p r i s t i n a i l f r a m e p o i n t e r
a d d i u $sp , $sp , 3 2 #L i b e r a l o s t a c k f r a m e
j r $ra #R i t o r n a i l c o n t r o l l o a l c h i a m a n t e
.data
$LC :
.ascii ”Il fattoriale d i 10 e ’ %dn”
Listing 2: Fattoriale in MIPS - Procedura main
13. MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (3/4)
.text
fact :
subu $sp , $sp , 3 2 #Lo S t a c k f r a m e e ’ g r a n d e 32 b y t e s
sw $ra , 2 0 ( $ s p ) #S a l v a l ’ i n d i r i z z o d i r i t o r n o
sw $fp , 1 6 ( $ s p ) #S a l v a i l f r a m e p o i n t e r
a d d i u $fp , $sp , 2 8 #I n i z i a l i z z a i l f r a m e p o i n t e r
sw $a0 , 0 ( $ f p ) #S a l v a l ’ argomento ( n )
lw $v0 , 0 ( $ f p ) #C a r i c a n
b g t z $v0 , $L2 #Se n>0 va a l l ’ i s t r u z i o n e $L2
l i $v0 , 1 #a l t r i m e n t i r i t o r n a 1
j r $L1 #p a s s a n d o p e r l ’ i s t r u z i o n e $L1
Listing 3: Fattoriale in MIPS - Procedura fact (1/2)
14. MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (4/4)
$L2 :
lw $v1 , 0 ( $ f p ) #C a r i c a n
subu $v0 , $v1 , 1 #C a l c o l a n − 1
move $a0 , $v0 #S p o s t a i l r i s u l t a t o i n $a0
j a l fact #Chiama f a c t
lw $v1 , 0 ( $ f p ) #C a r i c a n
mul $v0 , $v0 , $v1 #C a l c o l a f a c t ( n−1) ∗ n
$L1 : # I l r i s u l t a t o e ’ i n $v0
lw $ra , 2 0 ( $ s p ) #R i p r i s t i n a $ r a
lw $fp , 1 6 ( $ s p ) #R i p r i s t i n a i l f r a m e p o i n t e r
a d d i u $sp , $sp , 32 #L i b e r a l o s t a c k f r a m e
j r $ra #R i t o r n a i l c o n t r o l l o a l c a l l e r
Listing 4: Fattoriale in MIPS - Procedura fact (2/2)
15. MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura - Stack
16. MIPS & SPIM
Struttura di un programma MIPS
Riepilogo
1 Organizzazione della memoria
2 Struttura di un programma MIPS
3 Esercizi
17. MIPS & SPIM
Struttura di un programma MIPS
Struttura di un programma MIPS
.GLOBL
Dichiara un elemento come globale
Elementi globali possono essere riferiti da altri files
Il main ` dichiarato .GLOBL
e
.TEXT: definisce il segmento di codice
.DATA
Definisce il segmento di dato
Dipendentemente dalle variabili dichiarate, l’assembler alloca lo
spazio necessario al segmento
18. MIPS & SPIM
Struttura di un programma MIPS
.DATA
Permette di allocare dati associando un nome (label)
[name:] directive initializer [, initializer]+
⇓ ⇓ ⇓
var1: .WORD 10
19. MIPS & SPIM
Struttura di un programma MIPS
Tipi di dato
1
.BYTE: un dato da 8 bit ( 4 di parola, 1 byte)
.HALF: un dato da 16 bit ( 1 di parola, 2 byte)
2
.WORD: un dato da 32 bit (una parola, 4 byte)
.FLOAT: single precision floating point - un valore decimale a
32 bit
.DOUBLE: double precision floating point - un valore decimale
a 64 bit
.ASCII: una stringa ASCII
.ASCIIZ: una stringa ASCII terminata dal carattere nullo
(NUL o ‘0’)
.SPACE: alloca spazio per n bytes non inizializzati
20. MIPS & SPIM
Esercizi
Riepilogo
1 Organizzazione della memoria
2 Struttura di un programma MIPS
3 Esercizi
21. MIPS & SPIM
Esercizi
Homeworks (1/2)
Potenza iterativa
Scrivere una procedura MIPS che calcola la potenza ab , con
a ∈ N+ , b ∈ N in modo iterativo, ovvero:
int potenza iterativa ( int a , int b)
{
i f ( a < 1 | | b < 0)
return 0;
else {
int ret = 1;
f o r ( i n t i =0; i <b ; i ++)
ret = ret ∗ a ;
return ret ;
}
}
22. MIPS & SPIM
Esercizi
Homeworks (2/2)
Potenza ricorsiva
Scrivere una procedura MIPS che calcola la potenza ab , con
a ∈ N+ , b ∈ N in modo ricorsivo, ovvero:
int potenza ricorsiva ( int a , int b)
{
i f ( a < 1 | | b < 0)
return 0;
e l s e i f ( b == 0 )
return 1;
else
r e t u r n p o t e n z a r i c o r s i v a ( a , b −1)∗ a ;
}