---
# System prepended metadata

title: Practica 13

---

# Practica 13 

## Paso 1: Habilitación de interrupciones y modo de funcionamiento

### Cuestión 1. Código de inicio correcto.
```sh
#############################################################
##                    Starting code                        ##
#############################################################

          .text
          .globl __start
__start:
    la $t0, 0xffff0000
    li $t1, 0x2
    sb $t1, 0($t0)
    
    li $t1, 0x101
    mtc0 $t1, $12
```

### Cuestión 2. ¿Por qué se producen los mensajes de error?

Porque la dirección de retorno es la 0x00000000 ($k0 nunca se llega a modificar)

## Paso 2: Obtención de la dirección de retorno al programa de usuario 

### Cuestión 3. Copia aquí la línea de código que escribe en $k0 la dirección de retorno 

```sh
#############################################################
##                  CÓDIGO DEL MANEJADOR                   ##
#############################################################

    .ktext 0x80000080

    ## Preserva el contexto del programa de usuario
    ## (nada de momento)

    ## Identifica y trata excepciones
    ## (nada de momento)

    ## Restaura el contexto
    ## (nada de momento)

    ## Restaura el modo usuario y vuelve al programa
    ## (falta algo)

    ##----
    mfc0 $k0, $14     # $k0 <- EPC
    ##---


    rfe
    jr $k0 
```

## Paso 3: Tratamiento provisional de la interrupción de teclado 

![](https://i.imgur.com/Nz1qfQT.png)


### Cuestión 4. ¿Por qué se escriben tantos asteriscos al pulsar una tecla?

Porque no hemos cancelado la interupción 

## Paso 4: Cancelación de la interrupción 

### Cuestión 5. Líneas de código que cancelan la interrupción. 

![](https://i.imgur.com/JU6Eugi.png)


### Cuestión 6. ¿Por qué acaba el programa de usuario antes de lo esperado?

Porque el manegador modifica $t0 a 0xffff0000 que es un número negatvio y sale de del doble bule de bules.asm

## Paso 5: Gestión del contexto 

### Cuestión 7. Modificaciones: 

#### En el segmento de datos del manejador: 

#### En el código de inicio del sistema:

#### Al principio del código del manejador: 

#### Al final del código del manejador: 

## Paso 6: Habilitación de las interrupciones del reloj 

### Cuestión 8. Archivo teclado-y-reloj.handler. 

#### En el código de inicio: instrucciones que habilitan la interrupción del reloj

#### En el código de inicio: instrucciones que habilitan la interrupción del reloj

###  Cuestión 9. Explica por qué la consola mostrará asteriscos sin parar.

## Paso 7: Análisis de la causa de excepción 
### Cuestión 10. Archivo teclado-y-reloj.handler
#### Código a partir de retexc: 
#### Tratamiento de la interrupción del teclado
#### Tratamiento del reloj. 
#### Instrucciones que leen y aíslan el código de causa de excepción
#### Instrucciones que analizan los bits IP0 e IP2 de la palabra de estado






