SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
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
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.
MIPS & SPIM
  Introduzione a SPIM




Riepilogo




      1   Introduzione a SPIM


      2   Esercizi
            Correzione esercizi
            Homeworks
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
MIPS & SPIM
  Introduzione a SPIM




QtSPIM - GUI (1/2)
MIPS & SPIM
  Introduzione a SPIM




QtSPIM - GUI (2/2)
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 come
              identificativi
              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 system
              call 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 =        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
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
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
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
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
MIPS & SPIM
  Esercizi




Riepilogo




      1      Introduzione a SPIM


      2      Esercizi
               Correzione esercizi
               Homeworks
MIPS & SPIM
  Esercizi
    Correzione esercizi


Riepilogo




      1      Introduzione a SPIM


      2      Esercizi
               Correzione esercizi
               Homeworks
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 ;
              }
      }
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
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
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
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 ;

      }
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
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
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
MIPS & SPIM
  Esercizi
    Homeworks


Riepilogo




      1      Introduzione a SPIM


      2      Esercizi
               Correzione esercizi
               Homeworks
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 ) ;

Weitere ähnliche Inhalte

Andere mochten auch

Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAMBenchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAMNicola Paoletti
 
Marketing and Business Growth Consultant
Marketing and Business Growth ConsultantMarketing and Business Growth Consultant
Marketing and Business Growth ConsultantBalaji Pattabhiraman
 
Balaji pattabhiraman profile latest
Balaji pattabhiraman profile latestBalaji pattabhiraman profile latest
Balaji pattabhiraman profile latestBalaji Pattabhiraman
 
Lezione3 - MIPS & SPIM Unicam
Lezione3 - MIPS & SPIM UnicamLezione3 - MIPS & SPIM Unicam
Lezione3 - MIPS & SPIM UnicamNicola Paoletti
 

Andere mochten auch (6)

Top 10 bi
Top 10 biTop 10 bi
Top 10 bi
 
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAMBenchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
 
Top 10 bi
Top 10 biTop 10 bi
Top 10 bi
 
Marketing and Business Growth Consultant
Marketing and Business Growth ConsultantMarketing and Business Growth Consultant
Marketing and Business Growth Consultant
 
Balaji pattabhiraman profile latest
Balaji pattabhiraman profile latestBalaji pattabhiraman profile latest
Balaji pattabhiraman profile latest
 
Lezione3 - MIPS & SPIM Unicam
Lezione3 - MIPS & SPIM UnicamLezione3 - MIPS & SPIM Unicam
Lezione3 - MIPS & SPIM Unicam
 

Ähnlich wie Lezione5 - MIPS & SPIM Unicam

Lezione4 - MIPS & SPIM Unicam
Lezione4 - MIPS & SPIM UnicamLezione4 - MIPS & SPIM Unicam
Lezione4 - MIPS & SPIM UnicamNicola Paoletti
 
Lezione2 - Mips & Spim Unicam
Lezione2 - Mips & Spim UnicamLezione2 - Mips & Spim Unicam
Lezione2 - Mips & Spim UnicamNicola Paoletti
 
Laboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di datoLaboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di datoMajong DevJfu
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...UltraUploader
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...Cristian Randieri PhD
 
Codemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazioneCodemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazioneGabriele Guizzardi
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio cughetta
 
Introduzione ai Big Data e alla scienza dei dati - Exploratory Data Analysis
Introduzione ai Big Data e alla scienza dei dati - Exploratory Data AnalysisIntroduzione ai Big Data e alla scienza dei dati - Exploratory Data Analysis
Introduzione ai Big Data e alla scienza dei dati - Exploratory Data AnalysisVincenzo Manzoni
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018Marco Parenzan
 
Laboratorio Programmazione: Memoria dinamica
Laboratorio Programmazione: Memoria dinamicaLaboratorio Programmazione: Memoria dinamica
Laboratorio Programmazione: Memoria dinamicaMajong DevJfu
 
Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Roberto Barbiera
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolarePyCon Italia
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)STELITANO
 
php: back to basics
php: back to basicsphp: back to basics
php: back to basicsFabio Mora
 
Pycrashcourse3.0
Pycrashcourse3.0Pycrashcourse3.0
Pycrashcourse3.0rik0
 

Ähnlich wie Lezione5 - MIPS & SPIM Unicam (20)

Lezione4 - MIPS & SPIM Unicam
Lezione4 - MIPS & SPIM UnicamLezione4 - MIPS & SPIM Unicam
Lezione4 - MIPS & SPIM Unicam
 
Lezione2 - Mips & Spim Unicam
Lezione2 - Mips & Spim UnicamLezione2 - Mips & Spim Unicam
Lezione2 - Mips & Spim Unicam
 
Laboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di datoLaboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di dato
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
 
Codemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazioneCodemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazione
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
 
Pycon
PyconPycon
Pycon
 
Introduzione ai Big Data e alla scienza dei dati - Exploratory Data Analysis
Introduzione ai Big Data e alla scienza dei dati - Exploratory Data AnalysisIntroduzione ai Big Data e alla scienza dei dati - Exploratory Data Analysis
Introduzione ai Big Data e alla scienza dei dati - Exploratory Data Analysis
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
Rest sdk
Rest sdkRest sdk
Rest sdk
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Laboratorio Programmazione: Memoria dinamica
Laboratorio Programmazione: Memoria dinamicaLaboratorio Programmazione: Memoria dinamica
Laboratorio Programmazione: Memoria dinamica
 
Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)
 
php: back to basics
php: back to basicsphp: back to basics
php: back to basics
 
Pycrashcourse3.0
Pycrashcourse3.0Pycrashcourse3.0
Pycrashcourse3.0
 

Lezione5 - MIPS & SPIM Unicam

  • 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
  • 5. MIPS & SPIM Introduzione a SPIM QtSPIM - GUI (1/2)
  • 6. MIPS & SPIM Introduzione a SPIM QtSPIM - GUI (2/2)
  • 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
  • 16. MIPS & SPIM Esercizi Riepilogo 1 Introduzione a SPIM 2 Esercizi Correzione esercizi Homeworks
  • 17. MIPS & SPIM Esercizi Correzione esercizi Riepilogo 1 Introduzione a SPIM 2 Esercizi Correzione esercizi Homeworks
  • 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
  • 26. MIPS & SPIM Esercizi Homeworks Riepilogo 1 Introduzione a SPIM 2 Esercizi Correzione esercizi Homeworks
  • 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 ) ;