1. MIPS & SPIM
MIPS & SPIM
Modulo del Corso di Architettura degli Elaboratori
Nicola Paoletti
Universit` di Camerino
a
Scuola di Scienze e Tecnologie
27 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).
Lezione 4: Organizzazione della memoria, stack frame;
chiamate a procedura (esempio fattoriale); direttive.
3. MIPS & SPIM
Introduzione a SPIM
Riepilogo
1 Introduzione a SPIM
2 Esercizi
Correzione esercizi
Homeworks
4. MIPS & SPIM
Introduzione a SPIM
Il tool SPIM
SPIM ` un simulatore open source per programmi assembly
e
MIPS32
Naturalmente, non esegue programmi binari (compilati)!
La nuova versione - QtSPIM - ` disponibile all’indirizzo
e
https://sourceforge.net/projects/spimsimulator/files/;
supporta Windows - MacOSX - Linux(solo 32bit); per chi ha
Linux a 64 bit si pu`:
o
compilare i sorgenti, oppure
emulare la versione Windows con Wine
La vecchia pagina del simulatore in cui ` possibile trovare
e
ulteriore materiale ` all’indirizzo
e
http://pages.cs.wisc.edu/~larus/spim.html
7. MIPS & SPIM
Introduzione a SPIM
QtSPIM - Alcune Feature
Implementa quasi completamente il MIPS32 instruction set
Esecuzione/Esecuzione step-by-step/Debug
System calls
8. MIPS & SPIM
Introduzione a SPIM
SPIM - Sintassi
Codice commentato con #
Gli identificativi sono nel formato
[a-zA-Z. ][a-zA-Z0-9. ]∗
Gli opcode delle istruzioni non possono essere messi come
identificativi
label:
I numeri sono di default in base 10; valori hex indicati con 0xN
Le stringhe sono delimitate da “”
9. MIPS & SPIM
Introduzione a SPIM
SPIM - System Call (1/3)
Fornisce un piccolo insieme di servizi tipici dei sistemi operativi
Principalmente operazioni di input/output
Per richiedere un servizio, bisogna caricare in $v0 il system
call code
Example (Exit service)
li $v0, 10
syscall # esce dalla procedura
10. MIPS & SPIM
Introduzione a SPIM
SPIM - System Call (2/3)
Service Code Arguments Result
print int 1 $a0 = integer
print float 2 $f12 = float
print double 3 $f12 = double
print string 4 $a0 = string
read int 5 integer (in $v0)
read float 6 float (in $f0)
read double 7 double (in $f0)
read string 8 $a0 = buffer, $a1 =
length
sbrk 9 $a0 = amount address (in $v0)
exit 10
11. MIPS & SPIM
Introduzione a SPIM
SPIM - System Call (3/3)
Service Code Arguments Result
print character 11 $a0 = character
read character 12 character (in $v0)
open 13 $a0 = filename, $a1 = file descriptor (in $v0)
flags, $a2 = mode
read 14 $a0 = file descriptor, $a1 bytes read (in $v0)
= buffer, $a2 = count
write 15 $a0 = file descriptor, $a1 bytes written (in $v0)
= buffer, $a2 = count
close 16 $a0 = file descriptor 0 (in $v0)
exit2 17 $a0 = result
12. MIPS & SPIM
Introduzione a SPIM
Esempi (1/4)
Example (Hello world!)
.data
s t r : . a s c i i z ” H e l l o World ! ” #s t r i n g a d i c a r a t t e r i
.text
. g l o b l main
main :
l i $v0 , 4 #c o d i c e p e r p r i n t s t r i n g
l a $a0 , s t r #c a r i c o i n $a0 l a s t r i n g a con l a b e l s t r
syscall
l i $v0 , 10 #c o d i c e d i u s c i t a
syscall
13. MIPS & SPIM
Introduzione a SPIM
Esempi (2/4)
Example (Lettura e stampa di un intero)
.data
s t r 1 : . a s c i i z ” I n s e r i s c i un numero : ”
s t r 2 : . a s c i i z ” I l numero i n s e r i t o e ’ : ”
.text
. g l o b l main
main :
l i $v0 , 4 #c o d i c e p e r p r i n t s t r i n g
l a $a0 , s t r 1
syscall
l i $v0 , 5 #c o d i c e p e r r e a d i n t
syscall
move $s0 , $v0 #m e m ori z z o i l numero i n $ s 0
l i $v0 , 4
l a $a0 , s t r 2
syscall
l i $v0 , 1 #c o d i c e p e r p r i n t i n t
move $a0 , $ s 0
syscall
l i $v0 , 10 #c o d i c e d i u s c i t a
syscall
14. MIPS & SPIM
Introduzione a SPIM
Esempi (3/4)
Example (Lettura e stampa di una stringa)
.data
s t r : . s p a c e 10 #a l l o c a 10 b y t e s l i b e r i ( b u f f e r −a r r a y )
.text
. g l o b l main
main :
l a $a0 , s t r #$a0 = b u f f e r
l i $a1 , 10 #$a1 = l e n g t h
l i $v0 , 8 #c o d i c e p e r r e a d s t r i n g
syscall
l i $v0 , 4 #c o d i c e p e r p r i n t s t r i n g
syscall #i n $a0 c ’ e ’ a n c o r a s t r
l i $v0 , 1 0 #c o d i c e d i u s c i t a
syscall
15. MIPS & SPIM
Introduzione a SPIM
Esempi (4/4)
Example (Indirizzo e valore)
.data
val : . w o r d 0xA #10
ch : .asciiz ” ”
.text
. g l o b l main
main :
l a $a0 , v a l #c a r i c a i n $a0 l ’ i n d i r i z z o d i v a l
l i $v0 , 1
syscall #stampa l ’ i n d i r i z z o d i v a l o r e
l a $a0 , ch #c a r i c a i n $a0 i l c a r a t t e r e ” ”
l i $v0 , 4 #e l o stampa
syscall
l w $a0 , v a l #c a r i c a i n $a0 il contenuto di val
l i $v0 , 1 #e l o stampa
syscall
l i $v0 , 1 0 #c o d i c e d i u s c i t a
syscall
18. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza iterativa (1/4)
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 ;
}
}
19. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza iterativa (2/4)
.data
A: . w o r d 0xA #a=10
B: . w o r d 0 x3 #b=3
str1 : .asciiz ” alla ”
str2 : .asciiz ” = ”
str3 : . a s c i i z ” n”
.text
. g l o b l main
main : l i $v0 , 0 #( r i t o r n a 0 )
lw $a0 , B #C a r i c o B i n $a0
b l t z $a0 , p r i n t #B < 0 −> p r i n t
lw $a1 , A #C a r i c o A i n $a1
b l e z $a1 , p r i n t #A < 1 (A<=0)−> p r i n t
l i $v0 , 1 #v0 = 1
for : ...
Listing 1: Potenza iterativa in MIPS - Parte1
20. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza iterativa (3/4)
for : beq $a0 , $0 , p r i n t #B==0 −> end f o r
mul $v0 , $v0 , $a1 #v0 = v0 ∗A
subu $a0 , $a0 , 1 #B=B−1
j for
print : move $t1 , $v0 #t 1=v0
lw $a0 , A
l i $v0 , 1 #s y s t e m c a l l code p e r p r i n t i n t
syscall #”A”
l a $a0 , s t r 1
l i $v0 , 4 #s y s t e m c a l l code p e r p r i n t s t r
syscall #”A a l l a ”
lw $a0 , B
l i $v0 , 1
syscall #”A a l l a B”
...
Listing 2: Potenza iterativa in MIPS - Parte2
21. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza iterativa (4/4)
...
l a $a0 , s t r 2
l i $v0 , 4
syscall #”A a l l a B = ”
move $a0 , $ t 1 #v0=t 1
l i $v0 , 1
syscall #”A a l l a B = AˆB”
l a $a0 , s t r 3
l i $v0 , 4
syscall #”A a l l a B = AˆB n”
l i $v0 , 1 0 #c o d i c e d i u s c i t a
syscall
Listing 3: Potenza iterativa in MIPS - Parte3
22. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (1/4)
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 ;
}
23. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (2/4)
.data
...
.text
. g l o b l main
main : l i $v0 , 0 #( r i t o r n a 0)
lw $a0 , B #C a r i c o B i n $a0
b l t z $a0 , p r i n t #B < 0 −> print
lw $t0 , A #C a r i c o A i n $t0
l i $t1 , 1
b l e z $t0 , p r i n t #A < 1 (A<=0)−> p r i n t
j a l pow #Chiama l a f u n z i o n e pow
print : . . .
Listing 4: Potenza ricorsiva in MIPS - Parte1
24. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (3/4)
.text
pow : subu $sp , $sp , 3 2 #S t a c k f r a m e d i 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 frame p o i n t e r
sw $a0 , 0 ( $ f p ) #S a l v a l ’ argomento B
lw $v0 , 0 ( $ f p ) #C a r i c a B
b g t z $v0 , $L2 #B>0 −> 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
Listing 5: Potenza ricorsiva in MIPS - Parte2
25. MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (4/4)
$L2 : lw $v1 , 0 ( $ f p ) #C a r i c a B
subu $v0 , $v1 , 1 #C a l c o l a B − 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 pow #Chiama pow
lw $v1 , A #C a r i c a A
mul $v0 , $v0 , $v1 #C a l c o l a pow (A , B−1) ∗ A
$L1 : 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 . c o n t r o l l o a l c a l l e r
Listing 6: Potenza ricorsiva in MIPS - Parte3
27. MIPS & SPIM
Esercizi
Homeworks
Adding machine
Adding machine
Scrivere e testare un programma MIPS che legge in continuazione
un intero e lo somma ai precedenti. Non appena legge uno zero, il
programma termina stampando la somma ottenuta fino a tal
punto. In altre parole:
char c ;
i n t somma=0;
do{
c=g e t c h a r ( ) ;
somma+=a t o i ( c ) ;
}
w h i l e ( c != ’ 0 ’ ) ;
p r i n t f ( ”Somma=%d n” , somma ) ;