data

Commenti

Transcript

data
Laboratorio di Architettura degli Elaboratori
Dott. Massimo Tivoli
Introduzione a MARS: interfaccia, struttura di un programma, gestione dell’input
L’assemblatore e simulatore MARS
Permette di eseguire programmi assembler scritti per il processore MIPS.
Può essere scaricato dal sito
http://courses.missouristate.edu/KenVollmar/MARS/
Download MARS
• Scaricherete un file .jar: Mars.jar
• Per eseguirlo vi serve Java J2SE 1.4.2 (o versioni successive) SDK installato sul vostro computer
– “java ‐jar Mars.jar” (nella directory dove si trova Mars.jar)
L’interfaccia grafica di MARS
L’assemblatore e simulatore MARS si presenta organizzato in tre pannelli, che sono:
1) Il Pannello dell’editor
‐ editing del programma assembly
‐ display del segmento di testo, di dati e dello stack
(comprese le labels definite nel programma)
2) Il pannello dei registri della CPU e della FPU
‐ display dei registri generali
‐ display dei registri del co‐processore matematico
3) Il pannello dei messaggi
‐ messaggi di output di MARS
‐ messaggi di output del programma assembly (console
del programma)
MARS (continua…)
MARS
Il display dei registri
Mostra lo stato di tutti i registri della CPU e della FPU del MIPS.
Di default, il contenuto e l’indirizzo dei registri è codificato in esadecimale (lo si può visualizzare anche in decimale).
Il contenuto è aggiornato ogni volta che il programma interrompe la sua esecuzione, ovvero quando il programma
• termina;
• produce un errore;
• raggiunge un breakpoint definito dall’utente.
Registri e SPIM
MAR
Memoria
MBR
MEMORIA
R0 R1 R31
…
(r0)(at) (ra)
ALU
CONTROLLO
altri
registri…
CPU
Il segmento di testo
Mostra la porzione di memoria in cui è memorizzato il programma da eseguire (a partire dalla locazione 0x0040000).
Tale programma è costituito dal codice utente (ci sarebbe una parte di codice di sistema che si occupa della gestione della riga di comando e della terminazione, ma viene nascosta all’utente).
Una generica riga di questo segmento ha il seguente formato:
Numero di riga del programma contenente l’istruzione
[0x00400004] 0x8fa40000 lw $4,0($29) 89: lw $a0,0($sp)
Indirizzo dell’istruzione
Codifica dell’istruzione
Descrizione mnemonica in linguaggio macchina
dell’istruzione
(lo vedremo nella prossima lezione)
Codifica dell’istruzione
in linguaggio assembler
Segmento di dati e stack…
Mostra lo stato della memoria riservata ai dati statici (segmento di dato) e dinamici (stack) del programma.
Per facilitarne la lettura, ogni riga di tali segmenti mostra il contenuto (in esadecimale) di 8 word consecutive in memoria (1 word = 4 byte = 4 locazioni di memoria)
Queste word sono ordinate in maniera crescente da sinistra verso destra.
Ogni word, poiché il MIPS indirizza la memoria con il singolo byte, rappresenta a sua volta 4 locazioni consecutive che sono invece ordinate da destra verso sinistra.
…ovvero (per semplicità consideriamo 4 word consecutive):
Word 0
Word 1
Word 2
Word 3
corrisponde a:
…
Word 0
Word 1
Word 2
Word 3
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0xDE
0xEF
0xFF
0x7F
0xB5
0xEF
0xFF
0x7F
…
0x7FFFEF50
0x7FFFEF51
.
.
.
0x7FFFEF5F
0x7FFFEF60
0x7FFFEF50 + 1610 =
0x7FFFEF50 + 0x10 =
0x7FFFEF60
Esempio:
Determinare l’indirizzo dei byte di memoria evidenziati in rosso nella figura sottostante.
a) [0x10000000] 0x00000000 0x00000000 0x00000000 0x00000000
b) [0x10000010] 0x00000000 0x00000000 0x00000000 0x00000000
Risposta:
a) 0x10000005;
b) non si tratta di un indirizzo di memoria valido (i dati stanno a metà tra 0x10000010 e 0x10000011).
Struttura di un programma MARS
.data
………
.text
.globl main
main:
………
Facoltativo
Gestione dell’input in MARS (continua…)
Una volta assemblato il programma tramite il menu
Run
Assemble
il programma viene caricato in memoria ed è pronto per l’esecuzione che può avvenire passo‐passo o in modo completo
In questo stato di sospensione (o tra un
passo e l’altro dell’esecuzione), facendo
doppio‐clck sul contenuto di una qualsiasi
word nel segmento dati o di un qualsiasi registro
(apparte $zero, $ra, e pc)
è possibile inserire direttamente valori per,
rispettivamente, locazioni di memoria e registri
Gestione dell’input in MARS (continua…)
E’ inoltre possibile usare il segmento .data per inserire valori in memoria (a partire dalla locazione 0x10010000) secondo il seguente schema:
.data
label: Facoltativo
.tipo valore
.data
X: .word 65
.data
X: .word ‘A’
X: .word 0x00000041
dove label è un eventuale nome che si vuole associare alla locazione di memoria che si sta inizializzando mentre valore ne definisce il contenuto; tipo, infine, è la dimensione con cui si vuole rappresentare valore (es.
word (32 bit), half (16 bit), byte (8 bit)).
Gestione dell’input in MARS (continua…)
.data
X: .half 0xFFFFFFFF
.data
Y: .byte 0xFFFFFFFF
.data
Z: .asciiz 0x00000041
Errore!
.data
K: .asciiz “A”
.data
H: .asciiz ‘A’
Errore!
.data
Q: .asciiz “ABCDEFGH”
KY X
Q K
Q
Q
Esempio:
Caricare i valori numerici 14 e 5 rispettivamente nei registri R2 (v0) e R3 (v1) del simulatore MARS.
.data
X: .word 14
Y: .word 5
.text
.globl main
main:
lw $v0, X # oppure lw $2, X
lw $v1, Y # oppure lw $3, Y
j exit
exit:
Gestione dell’input in MARS (continua…)
MARS fornisce anche una modalità di inserimento dati interattiva usando alcune chiamate di sistema e
‐ la finestra di dialogo “MIPS Keyboard Input”
come console per l’input
‐ la tab “Run I/O” nel pannello dei messaggi come
console di output
Per invocare una chiamata di sistema è sufficiente utilizzare il comando syscall.
Prima di utilizzare tale comando, però, è necessario specificare tutti i parametri richiesti dalla particolare chiamata di sistema che si vuole utilizzare. Alcune chiamate di sistema
Chiamata di sistema
Print_string
Read_int
Codice
Parametri
4
$a0 (i.e., $4 o R4)
contiene l’indirizzo della
stringa da stampare
5
$v0 (i.e., $2 o R2)
conterrà il risultato della
lettura da tastiera
Prima di utilizzare una qualsiasi chiamata di sistema è necessario porre nel registro $v0 il relativo codice.
L’Help di MARS mostra la documentazione anche per tutte
le altre system calls (e per i vari comandi, etc.) – consultarlo di
tanto in tanto risulta essere molto comodo per la scrittura di
programmi assembly, nonché istruttivo ☺
Esempio: Lettura di un intero da tastiera.
.data
Stringa: .asciiz “Inserisci un numero: ”
.text
.globl main
main:
li $v0,4 # codice per la chiamata di sistema Print_string
la $a0,Stringa
syscall
li $v0,5 # codice per la chiamata di sistema Read_int
syscall
File: ReadNumber.asm
Gestione dell’input in MARS (continua…)
Attivando la seguente opzione dalla barra dei menù:
Settings
Program arguments provided to MIPS program
appare una casella di testo (“Program Arguments”) tramite la quale è possibile inserire direttamente i parametri della riga di comando del programma assembly
vedremo la gestione dei parametri sulla riga
di comando più avanti nel corso
Gestione dell’input in MARS
• Infine, MARS fornisce un’ulteriore modalità di inserimento dati:
– Input formattato in memoria
• Anche questa modalità di input la vedremo tali nelle prossime lezioni
Ora vediamo un esempio di programma in SPIM che riprenderemo
più volte nel corso delle lezioni
(aprire Lezione3.palindroma.asm con MARS…
viene dall’edizione precedente del corso…
non funziona…)
Per approfondimenti…
‐ Andare alla pagina del corso sulla mia web page
http://www.di.univaq.it/tivoli/LabArch/LabArch.html
‐ alcuni documenti su MARS
‐ alcuni manuali sul MIPS
‐ alcuni esempi svolti in MARS
‐ Consultare anche la pagina di MARS e l’Help di MARS
‐ http://courses.missouristate.edu/KenVollmar/MARS/