Lezione laboratorio SPIM
Transcript
Lezione laboratorio SPIM
Lezione laboratorio SPIM Uso di XSPIM Uso di PCSPIM Esercizio laboratorio 1 Cos’è SPIM e cosa fa? SPIM è un simulatore che esegue programmi per le architetture MIPS R2000/R3000 SPIM può leggere ed assemblare programmi scritti in linguaggio assembly MIPS SPIM contiene un debugger che consente di analizzare passo_passo il funzionamento dei programmi Utilizzeremo SPIM per provare programmi in linguaggio assembly 2 1 Perché utilizzare un simulatore MIPS ? Controllo degli errori Meccanismi di debug Possibilità di utilizzare MIPS su diverse piattaforme ( Unix, Linux, Windows ) A casa con Windows o Linux su macchine Intel, in laboratorio con Linux su macchine Intel L’alternativa più comune (assembly 80X86) è molto complessa e non adatta ad un corso universitario 3 Dove trovare SPIM? http://www.cs.wisc.edu/~larus/spim.html Esistono due versioni di SPIM Linux/Unix (xspim) Windows (pcspim) Per installare SPIM nella versione Windows Scaricare pcspim.exe (file di installazione) Fare doppio clic su pcspim.exe Seguire le indicazioni 4 2 XSPIM Scrivete xspim & e apparirà la schermata dell’interfaccia grafica di XSPIM Formata da cinque sezioni ... 5 Sezione Registri e Bottoni di controllo 6 3 La sezione Register Display Alla sommità si trova la sezione “register display” In essa sono visualizzati i valori di tutti i registri contenuti nella CPU e nella FPU di MIPS Vi sono 32 registri “generali”, 32 registri “floating point” e alcuni registri “speciali” (PC, LO, HI, . . .) Tutti i valori contenuti nei registri sono di norma rappresentati nel sistema numerico esadecimale (base 16) Il contenuto dei registri è aggiornato ogni volta che il programma si “ferma” (stops running) 7 I bottoni di controllo La sezione successiva contiene i bottoni di controllo che consentono di attivare i comandi MIPS : QUIT: Termina l’esecuzione del programma LOAD: Carica un nuovo programma MIPS. Deve essere stato scritto al di fuori di MIPS con un qualche Editor di testo (es.: JCreator in MS Windows) RELOAD: Ricarica il programma. E’ utilizzato quando si vuole ri_eseguire un programma dopo aver apportato delle modifiche al codice RUN: Esegue il programma caricato 8 4 I bottoni di controllo STEP: Esegue passo-passo il codice, una istruzione alla volta; questa funzionalità è utile per il debugging del programma CLEAR: Usato per il reset dei valori dei registri e/o di locazioni di memoria. (clear/register oppure clear / memory & register) register SET VALUE: Usato per assegnare valori ai registri utilizzati nel programma 9 I bottoni di controllo BREAKPOINTS: Usato per set/delete/list di breakpoints; i punti di breakpoints vengono fissati specificando l’indirizzo di locazioni di memoria, quando il programma verrà esguito, XSPIM sospenderà l’esecuzione alla istruzione specificata TERMINAL: Per passare alla console window di SPIM; sulla console vengono visualizzati i messaggi in output, e in essa viene digitato ogni input richiesto dal programma, inoltre la console rappresenta il luogo ove avviene ogni interazione con l’utente 10 5 Il Text Segments indirizzo indirizzodi di memoria memoriadella della istruzione istruzione codice codicemacchina macchinasimbolico simbolico (pseudo (pseudoistruzioni istruzioniespanse espanseee label sostituite con label sostituite connumeri) numeri) istruzioni istruzionitradotte tradotteinin codice macchina codice macchinabinario binario istruzioni istruzionioriginarie originariedel del programma programma dopo dopopunto-e-virgola punto-e-virgolaililnumero numerodi di riga e codice assembly originario riga e codice assembly originario 11 Il Text Segment La sezione text segments visualizza le istruzioni assembly del programma assieme al codice macchina corrispondente (che SPIM carica in memoria quando inizia l’esecuzione) Il primo numero a sinistra (tra parentesi quadre) è l’indirizzo (esadecimale) di memoria in cui si trova l’istruzione macchina Il secondo numero è la codifica numerica binaria dell’istruzione (in esadecimale) Il terzo elemento è la rappresentazione simbolica (mnemonica) dell’istruzione macchina 12 6 Il Text Segment Tutto ciò che segue il punto e virgola è l’ istruzione originaria del file assembly da cui ha avuto origina l’istruzione/i macchina Alle volte la parte della riga che segue l'istruzione macchina è vuota; ciò significa che l’istruzione macchina è stata prodotta come parte della traduzione di una pseudo-istruzione 13 Il Data Segment Messaggi Messaggidi diSPIM SPIM 14 7 Il Data Segment La sezione Data Segments visualizza la porzione di memoria che è usata per la memorizzazione dei dati La parte intestata “KERNEL” contiene dati del sistema operativo che vengono caricati non appena SPIM inizia la propria esecuzione e prima che il codice dell’utente sia caricato La sezione più in basso visualizza i messaggi emessi da SPIM 15 Struttura di un programma SPIM (1) .data Dichiara che le linee che seguono contengono dati da inserire nel data segment Alloca lo spazio per una singola parola e in essa memorizza il valore (15) var: .word 15 buf: .space 4 Alloca lo spazio vuoto (contenente garbage) di dimensione 4 (bytes) .text Dichiara che le linee che seguono sono istruzioni assembly, text segment .globl main Dichiara la label “main” global, cioè accessibile dall’esterno (da altri file) 16 8 Struttura di un programma SPIM (2) main: la $t0, var lw $s0, 0($t0) la $t1, buf sw $s0, 0($t1) Il programma inizia dalla label “main”. “var” punta alla parola precedente inizializzata con il valore 15. La pseudo_istruzione carica l’indirizzo rappresentato dalla label “var” nel registro $t0 Carica in $s0 il valore di “var”: 15 $t1 punta allo spazio di 4 byte allocato in precedenza Il valore di $s0 viene scritto nello spazio di 4 byte. 17 PCSpim 18 9 PCSpim finestra principale 19 PCSpim menu File Open 20 10 PCSpim menu File Open 21 PCSpim menu Simulatore 22 11 PCSpim Simulator Go 23 PCSpim Console 24 12 PCSpim Simulator Setting C:\Programmi\PCSpim\trap.handler 25 PCSpim Window Clear 26 13 Esercizio laboratorio 27 Esercizio laboratorio Dato in memoria centrale un vettore di integer (a 32 bit), dichiarato mediante le direttive .data e .word, di dimensione 10, di nome "vet", inizializzato con la seq. 10, 20, 30, 40, 50, 60 ,70, 80, 90, 100 Scrivere il codice assembly per leggere un intero ” i ” e stampare l’elemento i-esimo del vettore, vet[i] 28 14 Esercizio laboratorio (1) # DEFINIZIONI COSTANTI SIMBOLICHE # print_int = 1 print_string = 4 read_int = 5 read_string = 8 sbrk = 9 exit = 10 # DATI ################## .data vet: .word 10, 20, 30, 40, 50 .word 60, 70, 80, 90, 100 str1: asciiz "digita un numero da 0 a 9 : " 29 Esercizio laboratorio (2) # CODICE ############## # Uso dei registri # $t0 - temp/contatore # $t1 - addr elemento del vettore # $t2 - valore da memorizzare # $t3 - contatore # $t4 - temp # $t8 - indirizzo di base del vettore "vet" # $t9 - valore max (10) 30 15 Esercizio laboratorio (3) # MAIN ################### .text main: # Inizializzazione registri la $t8, vet # carico nel registro $t8 # l'indirizzo della base del vettore # stampa stringa di prompt li $v0, print_string la $a0, str1 syscall # lettura di "i" li $v0, read_int syscall move $t0, $v0 31 Esercizio laboratorio (4) # calcolo indirizzo dell'elemento i-esimo add $t0, $t0, $t0 #$t0 = 2*i add $t0, $t0, $t0 #$t0 = 4*i add $t1, $t8, $t0 #$t1 = indiriz.di vet[i] # stampa l'elemento i-esimo lw $a0, 0($t1) # versione con indice li #$a0 = vet[i] "lw $a0,vet($t0)" $v0, print_int syscall esci: li $a0, 0 li $v0, exit # FINE syscall 32 16 Laboratorio 4 - MIPS 1 - Esercizio SPIM Sia dato in memoria centrale un vettore di integer (a 32 bit), dichiarato mediante le direttive .data e .word, di dimensione 10, di nome "vet" e inizializzato con la sequenza di numeri: 10, 20, 30, 40, 50, 60 ,70, 80, 90, 100 .data vet: .word 10, 20, 30, 40, 50 .word 60, 70, 80, 90, 100 A lezione si è visto il codice assembly eseAs1.s che legge un valore di indice i e stampa l’elemento del vettore vet[i]. Come esercitazione sviluppare i seguenti punti: 1) scaricare il codice dell' esercizio visto a lezione eseAs1.s ; 2) far girare il codice mediante il simulatore SPIM; 3) fare un reload del codice, eseguirlo con il comando step, ed osservare come si modificano i valori dei registri; 33 Laboratorio 4 - MIPS 1 - Esercizio SPIM 4) introdurre nuove istruzioni in modo da visualizzare tutti gli elementi del vettore mediante un ciclo senza terminazione; 5) inserire una condizione di terminazione; 6) inserire un fine riga ("eol") dopo ogni elemento del vettore (usare la syscall print_string applicata alla stringa .asciiz "\n“ ); 7) inserire un "eol" ogni 2 elementi; 8) sommare tutti gli elementi del vettore nella variabile di memoria sum e stampare il risultato; 9) facoltativo: fare il reverse del vettore 34 17 Laboratorio 4 - MIPS 1 - Esercizio SPIM Nello sviluppare l'esercizio si suggerisce: di seguire l'ordine con cui sono esposte le operazioni da realizzare; di verificare il funzionamento del codice passo-passo mediante la funzione di avanzamento single step dello SPIM, osservando attentamente il modificarsi dei registri del processore e delle locazioni di memoria coinvolte dalla esecuzione delle singole istruzioni; di evitare (!!!) di lanciare un run per provare il codice del punto 4 (ciclo senza terminazione)! usare invece l'avanzamento a step. 35 36 18