# Practica 14 ETC ###### tags: ETC ![](https://i.imgur.com/CjGPtv0.png) ![](https://i.imgur.com/XCnJANl.png) ![](https://i.imgur.com/EuEKiuW.png) ## Cuestión 1 #### Teniendo Usuario0.s en ejecución, detenga el simulador. (Antes de respondersí en el cuadro “Execution paused by the user at PC = ...”, asegúrase que el PC apunta a una instrucción del programa de usuario, cuyas direcciones son del tipo “0x0040nnnn”. Si apunta a direcciones del tipo “0x8000nnnn”pulse que no y vuelva a intentarlo). ###### ►¿Qué vale el registro Status(registro $12) que aparece en la ventana superior del simulador? Status = 00000003 ###### ►¿En quémodo está funcionando el procesador? ¿Están habilitadas las interrupciones? Modo Usuario y con las Interrupciones Habilitadas (esto lo sabemos por el 3 de arriba, que equivale a un 11 en binario, el cual estaría en KUc e IEc. KUc (Kernel User) habilita el modo usuario con el 1 e IC habilita las Interruption Exception con 1). ###### ►¿Qué valen los bits de máscara de interrupción? 0000 Cuando es 0 están enmascarados = habilitados ###### ►Indique con qué instrucciones del código de inicio de se MiMoSv0.handlerse inhiben las interrupciones en los periféricos teclado, reloj y consola ```shell= ################################################################### ## CÓDIGO DE INICIO ## ################################################################### .text .globl __start __start: ## Preparo las interfaces de los periféricos li $t0, 0xffff0000 sb $zero, 0($t0) # inhibo interrupción en el HW del teclado li $t0, 0xffff0008 sb $zero, 0($t0) # inhibo interrupción en el HW de la consola li $t0, 0xffff0010 sb $zero, 0($t0) # inhibo interrupción en el HW del reloj ``` ###### ►Indique cómo se inicializa el registro de estado del coprocesador 0 ```shell= ## Preparo el registro de estado del coprocesador y fijo modo usuario mfc0 $t0, $12 ori $t0, $t0, 0x0003 # Interrupciones habilitadas mtc0 $t0, $12 ``` ## Cuestión 2. Escriba el código de tratamiento de la interrupción del reloj ```shell= int2: la $t0, segundos lw $t1, 0($t0) addi $t1, $t1, 1 sw $t1, 0($t0) li $t0, 0xffff0010 li $t1 , 1 sb $t1 0($t0) b retexc ``` ## Cuestión 3. Modifique el código de inicio del sistema para que la interrupción del reloj quede habilitada, tanto en la interfaz como en el registro de estado del coprocesador 0 ```shell= ################################################################### ## CÓDIGO DE INICIO ## ################################################################### .text .globl __start __start: ## Preparo las interfaces de los periféricos li $t0, 0xffff0000 sb $zero, 0($t0) # inhibo interrupción en el HW del teclado li $t0, 0xffff0008 sb $zero, 0($t0) # inhibo interrupción en el HW de la consola li $t0, 0xffff0010 li $a0 , 1 sb $a0 0($t0) # inhibo interrupción en el HW del reloj ## Preparo el registro de estado del coprocesador y fijo modo usuario mfc0 $t0, $12 ori $t0, $t0, 0x0403 # Interrupciones habilitadas mtc0 $t0, $12 ``` ## Cuestión 4. Escriba el código de la función get_time a continuación ```shell= ###### GET_TIME (Servicio 91) get_time: la $t0, segundos lw $v0, 0($t0) b retexc ``` ## Cuestión 5. ¿Podría ejecutarse correctamente Usuario0.s con el manejador MiMoSv.1?.¿Podría ejecutarse correctamente Usuario1.s con el manejador MiMoS v.0? Razone la resupuesta Usuario0.s com MMOSv1.handle si que funciona debido a que Usuario0.s no hace ninguna llamada al sistema. Sin embago al revés no funcionaría debido a que las exepciones están deshabilitadas en el manejador 0 y el Usuario1.s usa interrupciones ## Cuestión 6. Escriba el código de la función wait_time que se ha implementado ```shell= ###### WAIT_TIME (Servicio 92) wait_time: la $t0, estado li, $t1, ESPERANDO sw $t1, 0($t0) la $t0, segundos lw $t1, 0($t0) add $t1, $t1, $a0 la $t0, despertador sw $t1, 0($t0) b retexc ``` ## Cuestión 7. Escriba el código de la interrupción del reloj, desde la etiqueta int2 ```shell= ## Tratamiento de la interrupción de RELOJ int2: # Por implementar la $t0, segundos lw $t1, 0($t0) addi $t1, $t1, 1 sw $t1, 0($t0) li $t0, 0xffff0010 li $t1, 1 sb $t1 0($t0) la $t0, estado lw $t1, 0($t0) li $t2, ESPERANDO bne $t1, $t2, finsi la $t0, segundos lw $t1, 0($t0) la $t0, despertador lw $t2, 0($t0) bne $t1, $t2, finsi la $t0, estado li $t1, LISTO sw $t1, 0($t0) finsi: b retexc # fin ``` ## Cuestión 8. Detenga el programa usuario2.s justamente después de haber escrito el tiempo actual (n segundos). ¿Qué valen el PC y el registro Status? 403 ### ¿Qué código se está ejecutando: el manejador, el proceso de usuario o el proceso ocioso? El proceso ocioso