data
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/