lezione5 - mips & spim unicam
TRANSCRIPT
MIPS & SPIM
MIPS & SPIMModulo del Corso di Architettura degli Elaboratori
Nicola Paoletti
Universita di Camerino
Scuola di Scienze e Tecnologie
27 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).
Lezione 4: Organizzazione della memoria, stack frame;chiamate a procedura (esempio fattoriale); direttive.
MIPS & SPIM
Introduzione a SPIM
Riepilogo
1 Introduzione a SPIM
2 EserciziCorrezione eserciziHomeworks
MIPS & SPIM
Introduzione a SPIM
Il tool SPIM
SPIM e un simulatore open source per programmi assemblyMIPS32
Naturalmente, non esegue programmi binari (compilati)!
La nuova versione - QtSPIM - e disponibile all’indirizzohttps://sourceforge.net/projects/spimsimulator/files/;supporta Windows - MacOSX - Linux(solo 32bit); per chi haLinux a 64 bit si puo:
compilare i sorgenti, oppureemulare la versione Windows con Wine
La vecchia pagina del simulatore in cui e possibile trovareulteriore materiale e all’indirizzohttp://pages.cs.wisc.edu/~larus/spim.html
MIPS & SPIM
Introduzione a SPIM
QtSPIM - GUI (1/2)
Registri interi Segmento di testo
MIPS & SPIM
Introduzione a SPIM
QtSPIM - GUI (2/2)
Registri floating point Segmento dati
MIPS & SPIM
Introduzione a SPIM
QtSPIM - Alcune Feature
Implementa quasi completamente il MIPS32 instruction set
Esecuzione/Esecuzione step-by-step/Debug
System calls
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 comeidentificativi
label:
I numeri sono di default in base 10; valori hex indicati con 0xN
Le stringhe sono delimitate da “”
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 systemcall code
Example (Exit service)
li $v0, 10
syscall # esce dalla procedura
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
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 =flags, $a2 = mode
file descriptor (in $v0)
read 14 $a0 = file descriptor, $a1= buffer, $a2 = count
bytes read (in $v0)
write 15 $a0 = file descriptor, $a1= buffer, $a2 = count
bytes written (in $v0)
close 16 $a0 = file descriptor 0 (in $v0)
exit2 17 $a0 = result
MIPS & SPIM
Introduzione a SPIM
Esempi (1/4)
Example (Hello world!)
.data
s t r : . a s c i i z ” He l l o World ! ” #s t r i n g a d i c a r a t t e r i
. t e x t
. g l o b l main
main :l i $v0 , 4 #cod i c e pe r p r i n t s t r i n gl 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 rs y s c a l ll i $v0 , 10 #cod i c e d i u s c i t as y s c a l l
MIPS & SPIM
Introduzione a SPIM
Esempi (2/4)
Example (Lettura e stampa di un intero)
. da ta
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 ’ : ”
. t e x t
. g l o b l main
main :l i $v0 , 4 #c od i c e pe r p r i n t s t r i n gl a $a0 , s t r 1s y s c a l ll i $v0 , 5 #c od i c e pe r r e a d i n ts y s c a l lmove $s0 , $v0 #memorizzo i l numero i n $s0l i $v0 , 4l a $a0 , s t r 2s y s c a l ll i $v0 , 1 #c od i c e pe r p r i n t i n tmove $a0 , $s0s y s c a l ll i $v0 , 10 #c od i c e d i u s c i t as y s c a l l
MIPS & SPIM
Introduzione a SPIM
Esempi (3/4)
Example (Lettura e stampa di una stringa)
. da ta
s t r : . s p a c e 10 #a l l o c a 10 byt e s l i b e r i ( b u f f e r−a r r a y )
. t e x t
. g l o b l main
main :l a $a0 , s t r #$a0 = b u f f e rl i $a1 , 10 #$a1 = l ength
l i $v0 , 8 #c od i c e pe r r e a d s t r i n gs y s c a l ll i $v0 , 4 #c od i c e pe r p r i n t s t r i n gs y s c a l l #i n $a0 c ’ e ’ ancora s t rl i $v0 , 10 #c od i c e d i u s c i t as y s c a l l
MIPS & SPIM
Introduzione a SPIM
Esempi (4/4)
Example (Indirizzo e valore)
. da ta
v a l : .word 0xA #10ch : . a s c i i z ” ”
. t e x t
. g l o b l mainmain :
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 ll i $v0 , 1s y s c a l l #stampa l ’ i n d i r i z z o d i v a l o r el 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 stampas y s c a l llw $a0 , v a l #c a r i c a i n $a0 i l c on t enuto d i v a ll i $v0 , 1 #e l o stampas y s c a l ll i $v0 , 10 #c od i c e d i u s c i t as y s c a l l
MIPS & SPIM
Esercizi
Riepilogo
1 Introduzione a SPIM
2 EserciziCorrezione eserciziHomeworks
MIPS & SPIM
Esercizi
Correzione esercizi
Riepilogo
1 Introduzione a SPIM
2 EserciziCorrezione eserciziHomeworks
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:
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
Correzione esercizi
Potenza iterativa (2/4)
.data
A: .word 0xA #a=10B : .word 0x3 #b=3s t r 1 : . a s c i i z ” a l l a ”s t r 2 : . a s c i i z ” = ”s t r 3 : . a s c i i z ”\n”
. t e x t
. g l o b l mainmain : l i $v0 , 0 #( r i t o r n a 0)
lw $a0 ,B #Car i co B i n $a0b l t z $a0 , p r i n t #B < 0 −> p r i n tlw $a1 , A #Car i co A i n $a1b l e z $a1 , p r i n t #A < 1 (A<=0)−> p r i n tl i $v0 , 1 #v0 = 1
f o r : . . .
Listing 1: Potenza iterativa in MIPS - Parte1
MIPS & SPIM
Esercizi
Correzione esercizi
Potenza iterativa (3/4)
f o r : beq $a0 , $0 , p r i n t #B==0 −> end f o rmul $v0 , $v0 , $a1 #v0 = v0∗Asubu $a0 , $a0 , 1 #B=B−1j f o r
p r i n t : move $t1 , $v0 #t1=v0lw $a0 , Al i $v0 , 1 #system c a l l code pe r p r i n t i n ts y s c a l l #”A”l a $a0 , s t r 1l i $v0 , 4 #system c a l l code pe r p r i n t s t rs y s c a l l #”A a l l a ”lw $a0 , Bl i $v0 , 1s y s c a l l #”A a l l a B”. . .
Listing 2: Potenza iterativa in MIPS - Parte2
MIPS & SPIM
Esercizi
Correzione esercizi
Potenza iterativa (4/4)
. . .l a $a0 , s t r 2l i $v0 , 4s y s c a l l #”A a l l a B = ”move $a0 , $t1 #v0=t1l i $v0 , 1s y s c a l l #”A a l l a B = AˆB”l a $a0 , s t r 3l i $v0 , 4s y s c a l l #”A a l l a B = AˆB\n”l i $v0 ,10 #cod i c e d i u s c i t as y s c a l l
Listing 3: Potenza iterativa in MIPS - Parte3
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:
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 e
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 ;
}
MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (2/4)
.data
. . .
. t e x t
. g l o b l mainmain : l i $v0 , 0 #( r i t o r n a 0)
lw $a0 , B #Car i co B i n $a0b l t z $a0 , p r i n t #B < 0 −> p r i n tlw $t0 , A #Car i co A i n $t0l i $t1 , 1b l e z $t0 , p r i n t #A < 1 (A<=0)−> p r i n tj a l pow #Chiama l a f u n z i on e pow
p r i n t : . . .
Listing 4: Potenza ricorsiva in MIPS - Parte1
MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (3/4)
. t e x tpow : subu $sp , $sp ,32 #Stack frame d i 32 b y t e s
sw $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 Blw $v0 , 0 ( $fp ) #Ca r i c a Bbgtz $v0 , $L2 #B>0 −> L2l i $v0 , 1 #a l t r i m e n t i r i t o r n a 1j r $L1
Listing 5: Potenza ricorsiva in MIPS - Parte2
MIPS & SPIM
Esercizi
Correzione esercizi
Potenza ricorsiva (4/4)
$L2 : lw $v1 , 0 ( $fp ) #Ca r i c a Bsubu $v0 , $v1 , 1 #Ca l c o l a B − 1move $a0 , $v0 #Sposta i l r i s u l t a t o i n $a0j a l pow #Chiama powlw $v1 ,A #Ca r i c a Amul $v0 , $v0 , $v1 #Ca l c o l a pow(A,B−1) ∗ A
$L1 : lw $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 . c o n t r o l l o a l c a l l e r
Listing 6: Potenza ricorsiva in MIPS - Parte3
MIPS & SPIM
Esercizi
Homeworks
Riepilogo
1 Introduzione a SPIM
2 EserciziCorrezione eserciziHomeworks
MIPS & SPIM
Esercizi
Homeworks
Adding machine
Adding machine
Scrivere e testare un programma MIPS che legge in continuazioneun intero e lo somma ai precedenti. Non appena legge uno zero, ilprogramma termina stampando la somma ottenuta fino a talpunto. In altre parole:
char c ;i n t somma=0;do{
c=ge t cha r ( ) ;somma+=a t o i ( c ) ;
}wh i l e ( c != ’ 0 ’ ) ;p r i n t f ( ”Somma=%d\n” , somma ) ;