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