Lezione4 - MIPS & SPIM Unicam

1,205 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,205
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
52
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lezione4 - MIPS & SPIM Unicam

  1. 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. 2. MIPS & SPIMLezioni 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. 3. MIPS & SPIM Organizzazione della memoriaRiepilogo 1 Organizzazione della memoria 2 Struttura di un programma MIPS 3 Esercizi
  4. 4. MIPS & SPIM Organizzazione della memoriaSuddivisione della memoria (1/3)
  5. 5. MIPS & SPIM Organizzazione della memoriaSuddivisione 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. 6. MIPS & SPIM Organizzazione della memoriaSuddivisione 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. 7. MIPS & SPIM Organizzazione della memoriaStack 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. 8. MIPS & SPIM Organizzazione della memoriaStack 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. 9. MIPS & SPIM Organizzazione della memoriaStack 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. 10. MIPS & SPIM Organizzazione della memoriaStack 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. 11. MIPS & SPIM Organizzazione della memoriaEsempio 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. 12. MIPS & SPIM Organizzazione della memoriaEsempio 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. 13. MIPS & SPIM Organizzazione della memoriaEsempio 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. 14. MIPS & SPIM Organizzazione della memoriaEsempio 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. 15. MIPS & SPIM Organizzazione della memoriaEsempio di chiamata a procedura - Stack
  16. 16. MIPS & SPIM Struttura di un programma MIPSRiepilogo 1 Organizzazione della memoria 2 Struttura di un programma MIPS 3 Esercizi
  17. 17. MIPS & SPIM Struttura di un programma MIPSStruttura 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. 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. 19. MIPS & SPIM Struttura di un programma MIPSTipi 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. 20. MIPS & SPIM EserciziRiepilogo 1 Organizzazione della memoria 2 Struttura di un programma MIPS 3 Esercizi
  21. 21. MIPS & SPIM EserciziHomeworks (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. 22. MIPS & SPIM EserciziHomeworks (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 ; }

×