[http://www.di.univaq.it/muccini/labarch] Laboratorio di Architettura degli Elaboratori LabArch 2006 Secondo Quadimestre, a.a. 2005-2006 Docente: H. Muccini Lecture 15: - Macro - Eccezioni e interruzioni - I/O mappato Software Engineering and Architecture Group 2006 Henry Muccini Linguaggio Assembler Quando conviene usare l assembler: Per avere maggior controllo sul sistema (su sistemi embedded con requisiti di basso tempo o bassa occupazione di spazio) Quando usato in congiunzione con 4GL Per implementare solo le sezioni critiche L ingegnosita del programmatore puo superare la capacita dei compilatori Se lavoriamo su di un calcolatore ad hoc, che non prevede nessun linguaggio ad alto livello 2/16 1
Linguaggio Assembler Quando NON usare l assembler: Specifici per un dato calcolatore Programmi piu lunghi (fattore di espansione) I programmatori scrivono stesso # di righe di codice al giorno, indipendentemente dal linguaggio Piu difficili da leggere e con un maggior numero di errori Piu difficili da comprendere logicamente 3/16 Macro Cosa sono Differenze con le procedure Inconvenienti delle macro: Il parametro passato non deve essere un registro gia usato all interno della macro 4/16 2
Macro: definizione Definizione dimacro.macro <nomemacro> (<par>).end_macro Esempio di definizione di una Macro:.text.macro print_int($arg) la $a0, int_str # Load string address into first arg mov $a1, $arg # Load macro s parameter jal printf # Call the printf routine.end_macro 5/16 Macro: chiamata Chiamata a macro <nome macro> (parametro) Esempio di chiamate alla macro: print_int($7) print_int($a0) [No].macro print_int($arg) la $a0, int_str # Load string address into first arg mov $a1, $a0 # Load macro s parameter jal printf # Call the printf routine.end_macro 6/16 3
Eccezioni e interruzioni in MIPS 4 registri nel coprocessore 0: EPC: registro contenente l indirizzo dell istruzione che ha causato l interruzione BadVAddr: registro contente l indirizzo di memoria a cui e stato fatto riferimento (in caso di eccezione generata da un accesso in memoria) Status (registro di Stato) Cause (registro di Causa) Istruzioni sui 4 registri: lwc0, swc0, mfc0, mtc0 7/16 Dalla Lezione 12 8/16 4
9/16 (8 bit) Registro Stato Maschera delle interruzioni: 5 livelli inter. Hw e 3 software Campi Kernel/utente abilitazione: k/u = 0, se il programma si trovava nel kernel al momento dell interrupt k/u = 1, modalita utente al momento dell interrupt abilitazione = 0, interrupt disabilitate abilitazione = 1, interrupt abilitate Al verificarsi di una interruzione, questi 6 bit vengono scalati a sinistra di 2 posizioni 10/16 5
Registro Causa 4 bit di Codifica delle eccezioni Interruzioni pendenti: Bit =1, se una delle interrupt Hw non e stata ancora servita Codifica delle eccezioni: Descrive la causa dell eccezione (secondo una codifica) Gestione eccezioni ed interruzioni: MIPS trasferisce il controllo al gestore delle interruzioni, che si trova in 80000080 esa 11/16 Gestore interruzioni 1. Salva il contenuto di $a0 e $a1 Visto che verranno usati per passare gli argomenti dell interrupt 2. Sposta il contenuto dei registri Causa e EPC nei registri della CPU 3. Controlla i valori all interno del registro Causa, per controllare il tipo di interruzione/eccezione e vedere se stampare un messaggio di errore oppure no 12/16 6
# This is the exception handler code that the processor runs when an exception occurs. #It only prints some information about the exception, but scan server as a model of how to write a handler. Because we are running in the kernel, we can use #$k0/$k1 without saving their old values..ktext 0x80000080.set noat 1 move $k1 $at # Save $at.set at sw $v0 s1 # Not re-entrent and we can't trust $sp sw $a0 s2 # But, we need to use these registers mfc0 $k0 $13 srl $a0 $k0 2 andi $a0 $a0 0xf blez $a0 int_ret nop # Cause register # Extract Exception Code Field # Don't print interrupts # Print information about exception. li $v0 4 # syscall 4 (print_str) la $a0 m1_ syscall li $v0 1 # syscall 1 (print_int) srl $a0 $k0 2 # Extract ExcCode Field andi $a0 $a0 0xf syscall 3 2 13/16 I/O mappato Cosa significa: Possibilita di inserire e stampare dati su terminale I/O mappato: I registri utilizzati vengono visti come una speciale locazione di memoria Il terminale e composto da: Ricevitore Legge I dati inseriti da tastiera Trasmettitore Visualizza su schermo I dati del ricevitore Per usare I/O mappato, occore avviare SPIM con l opzione mapped_io 14/16 7
4 registri: Controllo del ricevitore Dati del ricevitore Controllo del trasmettitore Dati del trasmettitore 15/16 Controllo del ricevitore: Bit di Pronto: =1 la tastiera ha inviato dati non ancora letti dal reg. Dati del Ricevitore Da 0 1, quando un carattere viene introdotto (*)Da 1 0, quando il carattere e letto dal registro dei Dati Bit diabilitazione: Se posto = 1, il terminale genera una interruzione. In tal caso, il registro Stato deve abilitare l interruzione. Dati del ricevitore: Contiene gli ultimi 8 bit inseriti Quando questo registro legge i dati, pone a 0 il Bit di pronto del Controllo ricevitore (*) 16/16 8
Controllo del trasmettitore: Primo bit =1 pronto ad accettare un nuovo carattere in uscita Secondo bit = abilitazione interruzioni Dati del trasmettitore: Contiene gli ultimi 8 bit inviati alla console 17/16 Il corso e finito, andate in pace, e soprattutto In bocca al lupo!!!... e non fatevi rivedere a luglio!!! 18/16 9