MIPS & SPIM
MIPS & SPIMModulo del Corso di Architettura degli Elaboratori
Nicola Paoletti
Universita di CamerinoScuola di Scienze e Tecnologie
12 Aprile 2011AA 2010/2011
MIPS & SPIM
Lezioni precedenti
Lezione 1: linguaggio macchina/assembly/alto livello; RISCvs 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).
MIPS & SPIM
Organizzazione della memoria
Riepilogo
1 Organizzazione della memoria
2 Struttura di un programma MIPS
3 Esercizi
MIPS & SPIM
Organizzazione della memoria
Suddivisione della memoria (1/3)
Riservata400000
10000000
7fff fffc
Segmento di dato
Segmento di testo
Segmento di stack
hex
hex
hex
Dati statici
Dati dinamici
MIPS & SPIM
Organizzazione della memoria
Suddivisione della memoria (2/3)
Riservata400000
10000000
7fff fffc
Segmento di dato
Segmento di testo
Segmento di stack
hex
hex
hex
Dati statici
Dati dinamici
Segmento di testo(0x400000-0x10000000): memorizza ilcodice (le istruzioni) del programma
Segmento di dato (0x10000000-a):
suddiviso in
dati statici: contengono glioggetti di dimensione nota alcompilatore, la cui vita e l’interadurata di esecuzione delprogrammadati dinamici: sono i dati allocatia run-time; tale segmento puoespandersi verso l’alto persoddisfare le richieste delprogramma
MIPS & SPIM
Organizzazione della memoria
Suddivisione della memoria (3/3)
Riservata400000
10000000
7fff fffc
Segmento di dato
Segmento di testo
Segmento di stack
hex
hex
hex
Dati statici
Dati dinamici
Segmento di testo(0x400000-0x10000000)
Segmento di dato (0x10000000-a)
Segmento di stack (b-0x7fffffff): didimensione variabile; si espande verso ilbasso.
Naturalmente deve valere: a ≤ b
MIPS & SPIM
Organizzazione della memoria
Stack frame
Indirizzi di memoria alti
Indirizzi di memoria bassi
Lo stack
cresce
$fp
$sp
Variabili
locali
Registri
salvati
Argomento 5
Argomento 6
...
$fp (frame pointer) puntaalla prima parola del frame;$sp (stack pointer) puntaall’ultima parola dello stack
Lo stack si espande verso ilbasso, quindi l’indirizzopuntato da $sp e minore diquello puntato da $fp
MIPS & SPIM
Organizzazione della memoria
Stack frame - Chiamate a procedura (1/3)
Indirizzi di memoria alti
Indirizzi di memoria bassi
Lo stack
cresce
$fp
$sp
Variabili
locali
Registri
salvati
Argomento 5
Argomento 6
...
Fase 1. Il programma chiamante inizializza lostack
1 Passa gli argomenti. I primi 4 sono memorizzatiin $a0-$a3, i restanti all’inizio dello stack
2 Salva i registri di competenza del chiamante
3 Esegue un’istruzione $jal (jump and link), chesalta alla prima istruzione del programmachiamato e salva l’indirizzo di ritorno in $ra
($31)
MIPS & SPIM
Organizzazione della memoria
Stack frame - Chiamate a procedura (2/3)
Indirizzi di memoria alti
Indirizzi di memoria bassi
Lo stack
cresce
$fp
$sp
Variabili
locali
Registri
salvati
Argomento 5
Argomento 6
...
Fase 2. Il programma chiamato inizializza ilsuo stack frame
1 Alloca lo stack frame: $sp = $sp -
dimensione frame
2 Salva i registri di competenza del chiamato. Inparticolare salva $s0 - $s7, $fp e $ra prima dimodificarli, dato che il chiamante si aspetta ditrovarli inalterati
3 Inizializza il frame pointer: $fp = $sp +
dimensione frame - 4
MIPS & SPIM
Organizzazione della memoria
Stack frame - Chiamate a procedura (3/3)
Indirizzi di memoria alti
Indirizzi di memoria bassi
Lo stack
cresce
$fp
$sp
Variabili
locali
Registri
salvati
Argomento 5
Argomento 6
...
Fase 3. Il programma chiamato restituisce ilcontrollo 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 saltoall’indirizzo in $ra
MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (1/4)
main ( ){
p r i n t f ( ” I l f a t t o r i a l e d i 10 e ’ %d\n” , f a c t (10) ) ;}
i n t f a c t ( i n t n ){
i f ( n < 1)r e t u r n 1 ;
e l s er e t u r n n∗ f a c t ( n − 1) ;
}
Listing 1: Fattoriale in C
MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (2/4)
. t e x t
. g l o b l mainmain :
subu $sp , $sp , 32 #Lo Stack f rame e ’ grande 32 byt e ssw $ra , 2 0 ( $sp ) #Sa l va l ’ i n d i r i z z o d i r i t o r n osw $fp , 1 6 ( $sp ) #Sa l va i l v e c c h i o f rame p o i n t e raddiu $fp , $sp , 28 #I n i z i a l i z z a i l f rame p o i n t e r
l i $a0 , 10 #Mette l ’ argomento ( 10) i n $a0j a l f a c t #Chiama l a f u n z i o n e f a t t o r i a l el a $a0 , $LC #Mette i n $a0 l a v a r i a b i l e s t r i n g a $LCmove $a1 , $v0 #Sposta i l r i s u l t a t o d i f a c t i n $a1j a l p r i n t f #Chiama l a f u n z i o n e p r i n t f
lw $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 olw $fp , 1 6 ( $sp ) #R i p r i s t i n a i l f rame p o i n t e raddiu $sp , $sp , 32 #L i b e r a l o s t ac k f ramej r $ra #Ri to rna i l c o n t r o l l o a l ch iamante
. da ta$LC :
. a s c i i ” I l f a t t o r i a l e d i 10 e ’ %d\n”
Listing 2: Fattoriale in MIPS - Procedura main
MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (3/4)
. t e x tf a c t :
subu $sp , $sp ,32 #Lo Stack frame e ’ grande 32 b y t e ssw $ra , 20 ( $sp ) #Sa lva l ’ i n d i r i z z o d i r i t o r n osw $fp , 16 ( $sp ) #Sa lva i l f rame p o i n t e radd iu $fp , $sp ,28 #I n i z i a l i z z a i l f rame p o i n t e rsw $a0 , 0 ( $fp ) #Sa lva l ’ argomento ( n )
lw $v0 , 0 ( $fp ) #Ca r i c a nbgtz $v0 , $L2 #Se n>0 va a l l ’ i s t r u z i o n e $L2l i $v0 , 1 #a l t r i m e n t i r i t o r n a 1j r $L1 #passando pe r l ’ i s t r u z i o n e $L1
Listing 3: Fattoriale in MIPS - Procedura fact (1/2)
MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura (4/4)
$L2 :lw $v1 , 0 ( $fp ) #Ca r i c a nsubu $v0 , $v1 , 1 #Ca l c o l a n − 1move $a0 , $v0 #Sposta i l r i s u l t a t o i n $a0j a l f a c t #Chiama f a c tlw $v1 , 0 ( $fp ) #Ca r i c a nmul $v0 , $v0 , $v1 #Ca 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 $v0lw $ra , 20( $sp ) #R i p r i s t i n a $ralw $fp , 16( $sp ) #R i p r i s t i n a i l f rame p o i n t e radd iu $sp , $sp , 32 #L ib e r a l o s t a c k framej 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)
MIPS & SPIM
Organizzazione della memoria
Esempio di chiamata a procedura - Stack
main
fact (10)
fact (9)
fact (8)Vecchio $a0
Vecchio $ra
Vecchio $fp
Vecchio $a0
Vecchio $ra
Vecchio $fp
Vecchio $a0
Vecchio $ra
Vecchio $fp
Vecchio $ra
Vecchio $fp
STACK
Lo stack
cresce
MIPS & SPIM
Struttura di un programma MIPS
Riepilogo
1 Organizzazione della memoria
2 Struttura di un programma MIPS
3 Esercizi
MIPS & SPIM
Struttura di un programma MIPS
Struttura di un programma MIPS
.GLOBL
Dichiara un elemento come globaleElementi globali possono essere riferiti da altri filesIl main e dichiarato .GLOBL
.TEXT: definisce il segmento di codice
.DATA
Definisce il segmento di dato
Dipendentemente dalle variabili dichiarate, l’assembler alloca lospazio necessario al segmento
MIPS & SPIM
Struttura di un programma MIPS
.DATA
Permette di allocare dati associando un nome (label)
[name:] directive initializer [, initializer]+
⇓ ⇓ ⇓var1: .WORD 10
MIPS & SPIM
Struttura di un programma MIPS
Tipi di dato
.BYTE: un dato da 8 bit (14 di parola, 1 byte)
.HALF: un dato da 16 bit (12 di parola, 2 byte)
.WORD: un dato da 32 bit (una parola, 4 byte)
.FLOAT: single precision floating point - un valore decimale a32 bit
.DOUBLE: double precision floating point - un valore decimalea 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
MIPS & SPIM
Esercizi
Riepilogo
1 Organizzazione della memoria
2 Struttura di un programma MIPS
3 Esercizi
MIPS & SPIM
Esercizi
Homeworks (1/2)
Potenza iterativa
Scrivere una procedura MIPS che calcola la potenza ab, cona ∈ N
+, b ∈ N in modo iterativo, ovvero:
i n t p o t e n z a i t e r a t i v a ( i n t a , i n t b ){
i f ( a < 1 | | b < 0)r e t u r n 0 ;
e l s e {i n t r e t = 1 ;f o r ( i n t i =0; i<b ; i++)
r e t = r e t ∗ a ;r e t u r n r e t ;
}}
MIPS & SPIM
Esercizi
Homeworks (2/2)
Potenza ricorsiva
Scrivere una procedura MIPS che calcola la potenza ab, cona ∈ N
+, b ∈ N in modo ricorsivo, ovvero:
i n t p o t e n z a r i c o r s i v a ( i n t a , i n t b ){
i f ( a < 1 | | b < 0)r e t u r n 0 ;
e l s e i f ( b == 0)r e t u r n 1 ;
e l s er 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 ;
}