Esercitazione D.R. C. Raibulet - e-Learning
Transcript
Esercitazione D.R. C. Raibulet - e-Learning
Esercitazione 4 Eccezioni & Interruzioni in MIPS 32 Claudia Raibulet [email protected] Eccezioni ¾ ¾ ¾ Le eccezioni = variazioni delle condizioni normali di funzionamento della CPU Conseguenze delle eccezioni => cambiamento del normale fflusso di esecuzione di un pprogramma g La CPU “solleva” una eccezione e quindi cambia il flusso di esecuzione a seguito di: • errore del programma (non voluto dal programmatore) • richiesta del programma (voluta dal programmatore) • evento esterno (indipendente dal programma in esecuzione) ¾ In tutti i casi casi, il flusso di esecuzione passa ad una locazione prefissata, dove si trova il gestore delle eccezioni (exception handler) Tipi di eccezioni ¾ Tre categorie: • sincrone “involontarie” involontarie (impreviste, (impreviste causate da elaborazioni con valori non-ammissibili o indirizzi di memoria non accessibili o fuori range) o accessi scorretti a locazioni di memoria (non allineati o fuori dallo spazio del processo) o overflow aritmetico • sincrone “volontarie” (previste e richieste dal programmatore) o syscall, break • asincrone (indipendenti dall’esecuzione del programma in corso) o provocate dalle periferiche di I/O Gestione delle eccezioni in MIPS ¾ ¾ Il processore risponde ad una eccezione salvando l’indirizzo dell’istruzione dell istruzione che ha causato ll’eccezione eccezione, ed eseguendo una procedura detta “gestore delle eccezioni” (in PCSPIM – Exceptions.s) p ) collocata nello spazio p kernel text a ppartire dalla locazione 0x80000180 Il compito p dell’Exceptions.s p è di: • salvare lo stato corrente dei registri (Salvataggio) • svolgere g le operazioni p necessarie ad affrontare e risolvere l’eccezione (Trattamento) • ripristinare lo stato della macchina al momento dell’eccezione (Ripristino) Tipi di registri ¾ Per determinare la causa dell’eccezione l’Exception.s osserva i registri del co-processore 0 relativi alla gestione delle eccezioni: Registro Numero Significato BadVAddr 8 Indirizzo di memoria il cui riferimento ha provocato l’eccezione Status 12 Maschera delle interruzioni e bit di abilitazione Cause 13 Tipo di eccezione e interrupt in attesa di servizio EPC 14 Indirizzo dell’istruzione che ha causato l’eccezione ¾ Si usano le istruzioni • mtc0 – move to c0 • mfc0 – move from c0 per accedere ai valori di tali registri Schema del processore MIPS Memory CPU Coprocessor 1 (FPU) Registers Registers $0 $0 $31 $31 Arithmetic unit Multiply py divide Lo Arithmetic unit Hi Coprocessor 0 (traps and memory) Registers BadVAddr Cause Status EPC Registro Cause ¾ ¾ 8 bit pper interrupt p pendenti p 5 bit per il codice dell’eccezione 31 Branch d l delay 15 interrupt pendenti 8 6 2 codice eccezione Tabella delle eccezioni Numero Nome Descrizione 0 INT Interrupt esterno (periferica) 4 AdEL Load da indirizzo di memoria non allineato 5 AdES Store ad indirizzo di memoria non allineato 6 IBE Bus errore durante l’istruzione fetch 7 DBE Bus error durante load o store 8 Sys Invocazione syscall 9 B Bp E Eccezione i causata t da d breakpoint b k i t 10 RI Eccezione causata dall’istruzione riservata 11 CpU Co-processore non utilizzabile 12 Ov Overflow aritmetico 15 FPE g ppoint Eccezione causata da floating Esempio – overflow aritmetico .text main: # Genera un overflow aritmetico addizionando "con segno" due numeri # positivi la cui somma NON e' rappresentabile in complemento a 2 li $t0, 0x7fffffff # massimo positivo in complemento a 2 li $t1, 2 # aggiungo abbastanza per superare il massimo positivo add $a0, $t0, $t1 # cosa succede dopo aver eseguito questa istruzione? li $v0,, 1 syscall # stampa p il risultato dell'operazione p aritmetica jr $ra # fine Esempio – Overflow Aritmetico ¾ Il contenuto dei registri quanto si solleva l’eccezione: PC = 80000180 Status = 3000ff12 ¾ EPC = 00400030 HI = 00000000 Cause = 00000030 LO = 00000000 BadVAddr= 00000000 Il messaggio scritto nel Messagge Window: [0x0040002c] 0x34090002 ori $9, $0, 2 abbastanza per superare il massimo positivo [0 00400030] [0x00400030] 0 01092020 add 0x01092020 dd $4 $4, $8 $8, $9 succede dopo aver eseguito questa istruzione ? Exception occurred at PC=0x00400030 Arithmetic overflow ; 13: li $t1, 2 # aggiungo ; 14 14: add dd $$a0, 0 $t0 $t0, $t1 # cosa Osservazioni ¾ Si noti che quando avviene l’eccezione: • appare un messaggio sulla Messagge Window “Exception occured ...”; tale stampa è effetuata internamente dal simulatore i l e NON ddall E Exceptions.s i che h non ha h ancora iniziato l’esecuzione • PC assume il valore l 0x80000180, 0 80000180 l’i l’indirizzo di i iniziale i i i l dell’Exceptions.s • EPC assume il valore 0x00400030, 0x00400030 l’indirizzo l indirizzo della istruzione che ha provocato l’eccezione • Il registro Cause assume il valore 0x00000030 Registri EPC e BadVAddr ¾ EPC • Dopo che è avvenuta una eccezione il registro EPC contiene l’indirizzo dell’istruzione in corso di esecuzione (PC) quando è avvenuta l’eccezione ¾ BadVAddr • Se avviene una eccezione a seguito di un accesso g alla memoria, qquesto registro g contiene illegale l’indirizzo della locazione alla quale il programma ha tentato di accedere Esercizio 1 ¾ Si consideri il seguente esercizio: .data d t dato: .word 42 .text main: la lw lw jr ¾ $t0, dato $t1, 0($t0) ( ) $t2, 3($t0) $ra # indirizzo in data segment # lettura da locazione # lettura da locazione nop # fine Considerando che il programma è memorizzato partendo dall’indirizzo 0x00400024 e i dati dall’indirizzo 0x10010000 si chiede: • Quale istruzione genera l’eccezione? g Cause? • Cosa indica il registro • Quali valori assumono i registri EPC e BadVAddr? Registro g Status ¾ Interrupt enable: • 1 – interruzioni sono abilitate • 0 –interruzioni non sono abilitate ¾ Exception level: • 1 – settato a 1 dopo p che una eccezione è sollevata • 0 – il valore di default ¾ User mode: • 1 – se il pprocessore è in user mode (come ( sempre p in PC SPIM)) • 0 – se il processore è in kernel mode ¾ Interrupt mask esprime gli interrupt abilitati 1 15 iinterrupt t t mask 8 4 1 0 user mode interrupt enable exception level Break ¾ ¾ Interrompe con una eccezione l’esecuzione di un programma e avvia ll’esecuzione esecuzione dell dell’Exceptions Exceptions.ss Utilizzata principalmente dai debugger che assistono it il programmatore t nella ll correzione i dei d i programmi permettendone l’arresto in punti arbitrari l’ispe arbitrari, l’ispezione ione delle variabili ariabili e della memoria, la eventuale modifica del codice, e la prosecuzione dell’esecuzione break code 0 6 bit # causa l’eccezione code (1 – riservata al debugger) code su 20 bit 0xD 6 bit Esempio p - Break .text main: break 5 jjr $ra ¾ # genera break (parametro 5) # fine Il contenuto dei registri quanto si solleva l’eccezione: PC = 80000180 EPC = 00400024 Status = 3000ff12 HI = 00000000 ¾ Cause = 00000024 BadVAddr= 00000000 LO = 00000000 Il messaggio scritto nel Messagge Window: [0x00400024] 0x0000280d break $5 Exception occurred at PC=0x00400024 ; 8: break 5 # genera break (parametro 5) Osservazioni - Break ¾ ¾ ¾ La descrizione di break fa erroneamente intendere che genera una eccezione arbitraria, specificata dal parametro In realtà, sia su un vero sistema che sul simulatore, l’eccezione ggenerata è sempre p la stessa: con Exception p Code 9 La codifica dell dell’istruzione istruzione non è conforme alla specifica: considera solo i primi 5 bit del parametro e li colloca a partire dal bit 11 su 5 bit (quindi 16 16-11) 11) Exceptions.s ¾ ¾ ¾ ¾ ¾ Contiene il codice che gestisce le eccezioni Si trova alla locazione fissa 0x80000180 in area ktext riservata al sistema operativo Dal momento che viene eseguito g dopo p l’interruzione di un programma utente in un punto qualsiasi, è tenuto a preservare TUTTI i registri macchina Ad esso sono riservati due registri $k0, $k1 che può utilizzare senza doverne preservare i contenuti Al termine del trattamento dell’eccezione Exceptions.s ritorna al programma interrotto o termina i il programma Exceptions s Exceptions.s ¾ MIPS e quindi anche PCSPIM rileva e tratta le eccezioni i i PRIMA dell’esecuzione d ll’ i della d ll istruzione i i corrente: • se l’eccezione corrente era una interruzione, l’esecuzione del programma deve riprendere dall’istruzione corrente (salvata nel registro EPC) • se si tratta di un altro tipo di eccezione ed è possibile proseguire (se non è avvenuto un errore irreparabile o si tratta di un break), l’esecuzione deve riprendere ( ) dall’istruzione successiva (EPC+4) Esempio p Exceptions.s p .kdata save0: word 0 save1: word 0 .ktext 0x80000180 move $k1, $at sw sw # kernel text segment # used in pseudo-instructions # iin the th handler h dl code d $v0, save0 $a0 $a0, save1 Salvataggio: salva lo stato corrente dei d i registri i i Esempio p Exceptions.s p mfc0 $k0, $k0 $13 # moves coprocessor 00’ss # register 13 (Cause register) # into CPU register $k0 Come si puo’ sapere se si tratta di una eccezione o di una interruzione? Esempio Exceptions.s # Riconosce e distingue tra le eccezioni e gli interrupt andi $a0, $k0, 0x007c # Excp E mask: k 0x007c 0 007 = 0000 0000 0111 1100 bgtz $a0, Excp_ret # salta se ee' una eccezione (XXXX XXXX X000 00XX) # Stampa p Interrupt p rilevato li $v0, 4 la $a0, __m3_ syscall ll # print i " IInterrupt “ # Gestione dell dell'Interrupt Interrupt da XXXX non trattata in questo esempio IntXXXX: ... EndIntXXXX: Esempio Exceptions.s Come si finisce di trattare una interruzione? Esempio Exceptions.s # Rientro dalla gestione degli interrupt # Si resetta il Cause register mtc0 $0, $13 # Ripristino registri salvati lw $v0, save0 lw $a0, save1 move $at, $k1 # Si preleva l'indirizzo di ritorno # e salta all'indirizzo di ritorno eret # Return from exception handler Esempio p Exceptions.s p # Gestione delle eccezioni Excp_ret: # Stampa le info sulla eccezione li $v0, $ 0 4 la $a0, __m1_ syscall y # pprint " Exception p " li $v0, 1 srl $a0, $a0 $k0, $k0 2 andi $a0, $a0, 0x1f syscall # shift right logical - estrae il Codice eccezione # print Codice eccezione li $v0, 4 lw $a0, $a0 __excp($k0) excp($k0) syscall # print stringa def eccezione srl $k0, $k0, 2 # estrae il Codice eccezione perche’ # era in $a0 che e’ stato sovracritto E Esempio i Exceptions.s E ti Excp_Break: E B k bne $k0, 0x9, End_Excp_Break li $v0, $v0 4 la $a0, _brk_msg y syscall j # non è break # syscall 4 (print (print_str) str) # eccezione break! End_Excp_Hnd End_Excp_Break: # Fine gestione break Esempio p Exceptions.s p # Gestione dell'eccezione "Bad address" Excp_Bad_addr: # Salta se non e' l'eccezione “Load from Bad address" bne $k0, 0x4, End_Excp_Bad_addr mfc0 $a0, $a0 $8 # carica BadVAddr andi $a0, $a0, 0x3 # E’ allineato alla word? # Uno dei 2 bit è a 1? beq $a0, $0, End_Excp_Hnd li $v0, 10 # Exit nel caso di "Bad address" syscall #10 – codice di EXIT j End_Excp_Hnd End Excp Hnd End Excp Bad addr: End_Excp_Bad_addr: # Fine gestione "Bad Bad address" address Esempio Exceptions.s End_Excp_Hnd: mtc0 $0, $13 lw $v0, save0 l lw $a0, $a0 save1 sa e1 move $at, $k1 # Epilogo del gestore delle Eccezioni # Si resetta il Cause register # Si ripristina i registri salvati # Si preleva l'indirizzo di ritorno e salta all'indirizzo di ritorno mfc0 $k0, $14 # carica EPC in $k0 addi $k0, $k0, 4 # Ritorna alla istruzione successiva mtc0 $k0, $14 eret # Return from exception handler Istruzioni di accesso ai registri del co--processore 0 co ¾ ¾ ¾ mfc0 – move from coprocessor 0 mtc0 – move to coprocessor 0 eret – return from Exceptions.s Exceptions s Osservazione ¾ ¾ eret – ritorna alla istruzione specificata in EPC Eccezioni: • si s deve incrementare c e e a e EPC C di d 4 e salvare sa va e il nuovo uovo valore va o e in EPC nel coprocessore ¾ Interruzioni: • non si deve eseguire nessuna modifica Esercizio 2 ¾ Si chiede di modificare il codice dell’Exceptions.s p in modo tale da stampare p a console il parametro dell’istruzione break Bibliografia ¾ Appendice A – Sezione A.7 Interruzioni in PCSPIM Input/Output Interrupt p ¾ ¾ ¾ Sono tipicamente causati da dispositivi hardware esterni e collegati al processore attraverso delle linee di esterni, controllo di bus, come ad esempio le periferiche I/0 Q d lle periferiche Quando if i h sono pronte t add effettuare ff tt operazioni impostano una linea di interruzione collegata alla CPU Quando viene attivata una linea di interruzione, se il sistema i ha h abilitato bili le l interruzioni i i i della d ll CPU, il normale flusso di esecuzione viene interrotto, e la CPU passa a gestire i l’interrupt l’i Interrupt p abilitati ¾ All’interno dell’interrupt mask (del Status Register) ciascun bit corrisponde all all’abilitazione abilitazione di una differente linea di interruzione collegata ad una o piu’ periferiche • Se il bit è impostato a 1 il corrispondente interrupt è abilitato e la periferica può generare una eccezione • Se il bit è impostato p a 0 il corrispondente p interrupt p NON è abilitato e anche se la linea di interruzione è attivata dalla periferica, la CPU non genera l’eccezione ¾ Quando Q d viene i sollevata ll una eccezione i a seguito i di un interruzione abilitata, nel registro Cause viene impostato a 1 il bit corrispondente all all’interruzione interruzione Interrupt I t t abilitati bilit ti Registro Cause 15 6 8 Interruzione i interrupt pendenti Registro Status 1 15 iinterrupt t t mask 8 2 codice eccezione 4 1 0 user mode interrupt enable exception level Input/Output p p ¾ ¾ PCSPIM simula un terminale/console (una periferica di I/O) che permette di visualizzare caratteri sul video e leggere caratteri dalla tastiera Il terminale è composto da due dispositivi distinti e indipendenti: • Transmitter: visualizza caratteri ASCII sulla Console • Receiver: accetta caratteri ASCII dalla tastiera ¾ Osservazione: essendo indipendenti indipendenti, un tasto premuto sulla tastiera non viene automaticamente mostrato sulla console;; un programma p g deve esplicitamente p fare l’eco di un carattere letto dal Receiver inviandolo al Transmitter Input/Output p p ¾ In PCSPIM i dispositivi Receiver e Transmitter sono controllati tramite 4 registri i cui contenuti appaiano a specifici indirizzi di memoria: • • • • ¾ Receiver R i Control C l Receiver Data T Transmitter C Controll Transmitter Data 00xFFFF0000 FFFF0000 0xFFFF0004 0 FFFF0008 0xFFFF0008 0xFFFF000c Per utilizzare i dispositivi di I/O memory-mapped è necessario abilitare l’opzione relativa nel Settings di PCSPIM Il Receiver: Receiver Control Ready: 1 – carattere ricevuto dal Receiver 0 – nessun carattere ricevuto dal Receiver 1 0 Receiver Control IInterrupt t t Enable: E bl 1 – Interrupt Receiver Abilitati 0 – Interrupt Receiver Disabilitati ¾ ¾ Il bit di Readyy è in sola lettura ((le scritture vengono g ignorate) g ) Il bit di Ready passa da 0 a 1 quando un carattere è arrivato dalla tastiera, ma non è stato ancora pprelevato dal Receiver Data Il Receiver: Receiver Data Receiver Data 7 0 Codice ASCII del tasto premuto ¾ Il codice ASCII del tasto ppremuto è valido soltanto se Ready = 1 (nel Receiver Control) Il Transmitter: s e : Transmitter s e Control Co o Ready: 1 – Transmitter pronto ad inviare il prossimo carattere 0 – Transmitter occupato a scrivere il precedente carattere 1 0 Trasmitter Control ¾ ¾ Interrupt Enable: 1 – Interrupt Transmitter Abilitati 0 – Interrupt Transmitter Disabilitati Il bit di Ready è in sola lettura (le scritture vengono ignorate) R d = 1 se il Transmitter Ready T itt è pronto t a scrivere i un nuovo carattere, e “0” se è occupato a scrivere il carattere precedente Il Transmitter: Transmitter Data Transmitter Data 7 0 Codice ASCII del carattere da stampare ¾ ¾ È possibile stampare un carattere solo scrivendolo nel T Transmitter itt Data D t quando d il bit di Ready R d del d l Transmitter T itt Control è 1; Altrimenti se il bit di Ready è zero il carattere non sarà Altrimenti, visualizzato e andrà perso Tastiera ¾ ¾ ¾ È collegata alla linea di interruzione che fa capo al bit 8 dei registri Status e Cause Per abilitare le interruzioni dalla tastiera si abilita il bit 8 del registro Status Per scoprire se ll’interruzione interruzione è stata provocata dalla tastiera si verifica il valore del bit 8 nel registro Cause Esempio di uso Exceptions.s # Il programma scrive una successione infinita di 0 # Alla pressione di un tasto stampa una stringa di avviso # “ Interrupt “ .globl __start .data car0: 0 .asciiz ii “0” .text __start: start: # Abilita gli interrupt in generale mfc0 $t0, $12 # Leggi Status Register (12) ori $t0, $t0, 1 # Abilita in generale gli INT ori $t0, $t0, 0x100 # Abilita gli INT da Tastiera mtc0 t 0 $t0, $t0 $12 # Scrivi S i i il nuovo Status St t Register R it Esempio di uso Exceptions Exceptions.ss # Abilita gli interrupt dalla periferica I/O, I/O dal Receiver lw $t1, 0xFFFF0000 # Leggi attuale Receiver Control $$t1,, $$t1,, 2 # Abilita ggli INT da Receiver ori sw $t1, 0xFFFF0000 # Scrivi il nuovo Receiver Control Ready: 1 – carattere ricevuto dal Receiver 0 – nessun carattere tt ricevuto i t dal d l Receiver R i 1 0 Receiver Control Interrupt Enable: 1 – Interrupt Receiver Abilitati 0 – Interrupt Receiver Disabilitati Esempio di uso Exceptions Exceptions.ss # Stampa in un ciclo infinito il carattere 0 ciclo: la $a0, car0 # stringa “0" li $v0, 4 # print string syscall li $t0, 0x00000fff perdi tempo: perdi_tempo: addi $t0, $t0, -1 bnez $t0, perdi_tempo b ciclo # costante grande # decrementa # gira a vuoto # ciclo infinito Esempio di uso Exceptions Exceptions.ss # DISABILITA Interruzioni dal Receiver (tastiera) lw $a0, 0xffff0000 # Leggi attuale Receiver Control andi $a0, $a0, 0xfffd # Azzera bit 1 = INT enable sw $a0 $a0, 0xffff0000 # Scrivi nuovo Receiver Control # DISABILITA Interrupt dalla tastiera nella CPU mfc0 $a0, $12 # Leggi il CPU Status Reg. andi $a0, $a0, 0xfeff # Azzera il bit INT della tastiera mtc0 $a0, $12 # Scrivi il nuovo CPU Status Reg. Esercizio ¾ Si chiede di utilizzare il Receiver Control and Data per leggere i caratteri inseriti dalla tastiera. Si chiede di stampare il carattere inserito utilizzando una syscall. E Esercizio i i - Soluzione S l i .data data Fine: .ascii "q" # carattere da premere per finire Messaggio: .ascii "Il tasto premuto e':" # nota: t questa t stringa ti non e'' terminata t i t con byte b t 0! Carattere: .asciiz "\n\n" \n\n # due a capo (il primo verra' sovrascritto) .text main: Esercizio - Soluzione li $t0, 0xFFFF0000 # Receiver Control li $t2, 0xFFFF0004 # Receiver Data lb $$t4, 4 Fi Fine # carattere per finire fi i BusyWaitRead: # "busy wait" lw $t1, $t1 0($t0) # Receiver Control Register andi $t1, $t1, 0x1 # tiene solo il bit 0 q $t1, BusyWaitRead y # se e' 0, non e' ancora arrivato nulla beqz # Ready = 1, e' arrivato un carattere lb $t3, 0($t2) # legge byte dal Receiver Data b beq $ 3 $t4, $t3, $ 4 fine fi # se e'' il tasto di fine, fi escii sb $t3, Carattere # e lo salva in memoria li $v0, $v0 4 # Stampa il carattere con la syscall la $a0, Messaggio # il carattere e' incorporato ! syscall # stampa con syscall b BusyWaitRead fine: Esercizio ¾ Si chiede di modificare l’esercizio precedente utilizzando gli interrupt per evitare di fare “busy wait”. # Da inserire nel Exceptions.s nella gestione degli interrupt IntKbd: andi $a0, $k0, 0x0100 # Receiver ece ve mask: s : 00x0100 0 00 = 0000 000 0001 0000 0000 beq $a0, $0, EndIntKbd # branch se e' interrupt ma non di Receiver # E' interrupt del Receiver, quindi ... # Stampa le info sull sull'interrupt interrupt li $v0, 4 la $$a0,, __m5_ syscall # print " by Receiver " Exceptions.s p - Interrupt p dalla tastiera # DISABILITA Interruzioni dal Receiver (tastiera) gg attuale Receiver Control lw $a0, 0xFFFF0000 # Leggi andi $a0, $a0, 0xfffd # Azzera bit 1 = INT enable sw $a0, 0xFFFF0000 # Scrivi nuovo Receiver Control # DISABILITA Interrupt Receiver nella CPU mfc0 $a0, $a0 $12 # Leggi il CPU Status Reg. Reg andi $a0, $a0, 0xfeff # Azzera il bit INT del Receiver mtc0 $a0, $12 # Scrivi il nuovo CPU Status Reg. g # Gestione del char digitato l lw $a0, $ 0 0xFFFF0004 0 FFFF0004 # prelevo l il carattere tt dal d l Data D t Reg. R sw $a0, BuffKbd # e lo metto nel buffer comune EndIntKbd: Esempio uso Exceptions Exceptions.ss # Abilita interrupt della CPU mfc0 $t0, $12 # Leggi il CPU Status Reg. ori $t0, $t0 $t0, $t0 1 # abilita in generale gli INT ori $t0, $t0, 0x100 # abilita il bit INT del Receiver # Scrivi il nuovo CPU Status Reg. g mtc0 $$t0,, $$12 # Abilitazione Interrupt dal Receiver (tastiera) lw $t1, 0xFFFF0000 # Leggi attuale Receiver Control Reg. ori $t1, $t1, 2 # bit 1 = INT enable sw $t1 $t1, 0xFFFF0000 # scrivi nuovo Receiver Control Reg. Reg Esercizi Esercizio 1 ¾ Dato il seguente frammento di codice, in quale punto avviene i un'eccezione ' i di Overflow O fl (considerando ( id d che h i numeri sono interi positivi in CA2)? li $t0, $ 0x7FFFFFFD li $t1, 1 add $t0, $t0 $t0, $t0 $t1 add $t0, $t0, $t1 add $t0, $t0, $t1 add $t0, $t0, $t1 lw $t2, 0($t0) b break k2 # riga 1 # riga 2 # riga 3 # riga 4 # riga 5 # riga i 6 1. 2. 3. 4. 5. 6 6. 7. Alla riga 1 Alla riga 2 Alla riga 3 Alla riga 4 Alla riga 5 Alla riga 6 Non avviene nessuna eccezione 8. Nessuna delle altre Esercizio 2 ¾ Se il registro Cause assume il valore 0x0000 0024, quale eccezione si è verificata? 1. 2. 3. 4 4. 5. 6 6. 7. Break Exception Syscall Exception AdES (scrittura non allineata in memoria) Ad (l AdEL (lettura non allineata lli da d memoria) i ) Interrupt Exception O fl E Overflow Exception ti Nessuna delle altre Esercizio 3 ¾ Dato il seguente frammento di codice di un Exceptions s specificare quale riga riconosce Exceptions.s, correttamente un'eccezione di tipo Interrupt. ... mfc0 $k0, $13 # Cause register srl $k0, $k0, 2 andi $k0, $k0 $k0 $k0, 0x1f Riga 1: bnez $k0, is_irq # riga 1 Riga 2: bgtz $k0, is_irq # riga 2 Riga 3: bltz $k0, is_irq # riga 3 Riga 4: beqz $k0, is_irq # riga 4 ... is_irq: # gestione Interrupt 1. 2. 3. 4. 5. Alla riga g 1 Alla riga 2 Alla riga 3 Alla riga 4 Nessuna delle altre Esercizio 4 ¾ Considerando che il programma è memorizzato partendo dall’indirizzo 0x00400024 e i dati dall’indirizzo 0x10010000 si chiede: • Quale istruzione genera l’eccezione? • Cosa C i di il registro indica i t Cause? C ? • Quali valori assumono i registri EPC e BadVAddr? .data dato: .word 33 .text main: la $t0, dato lw $t1 $t1, 0($t0) li $t2, 1 add $t2, $t2, $t0 sw $t2 $t2, 0($t2) jr $ra