Arquitectura-de-Computadoras

💻Interrupciones

Indice

Interrupciones_por_Software

Interrupcion Funcion
INT 0 Detiene el programa. Igual a HLT
INT 3 Debug. No lo vamos a utilizar
INT 6 Lee un caracter desde teclado
INT 7 Imprime un string en pantalla
INT 6 INT 7
```Assembly ORG 1000H LEIDO DB ? ORG 2000H MOV BX, OFFSET LEIDO INT 6 INT 0 END ``` ```Assembly ORG 1000H MENSAJE DB "ARQUITECTURA DE COMPUTADORAS" FIN DB ? ORG 2000H MOV BX, OFFSET MENSAJE MOV AL, OFFSET FIN - OFFSET MENSAJE INT 7 INT 0 END ```

Memoria_E_S_y_PIO

La memoria E/S es igual a la memoria común! Como son iguales, necesito de un mecanismo para distinguirlas :

Nos comunicamos con los dispositivos de E/S a través de dispositivos internos.

Cada uno de estos dispositivos internos se configuran, a través de la E/S y tienen asignado una zona de memoria fija (de E/S)

PIO

Es un puerto paralelo de E/S

Contra de 2 puertos paralelos configurables.

Ocupa 4 celdas en la memoria de E/S:

Memoria Dispositivos

Ej. Queremos que el PA tenga todos los bits como entrada excepto el menos significativo

MOV AL, 11111110b
OUT 32H, AL ;CA = 11111110
Ej Salida. Prender todas las luces Ej Entrada. Leer el estado de las llaves y prender las luces de aquellas llaves que esten en 1.
```Assembly ORG 2000H MOV AL, 0H OUT 33H, AL ;CB = 00000000 MOV AL, 11111111B ;Tambien se pueden usar hexa OUT 31H, AL ;PB = 11111111 INT 0 END ``` ```Assembly ORG 2000H ;CONFIGURAMOS PA (ENTRADA) Y PB (SALIDA) MOV AL, 11111111b OUT 32H, AL ;CA = 11111111 MOV AL, 00000000B OUT 33H, AL ;CB = 00000000 ;PASO LO QUE TENNGO EN PA (LAS LLAVES) LOOP: IN AL, 30H ;MANDAR LA INFORMACION DE LAS LLAVES A LAS LUCES (PB) OUT 31H, AL JMP LOOP INT 0 END ```

Interrupciones_por_Hardware

Nos vamos a manejar con 4 dispositivos externos.

HARDWAREOWO

PIC

Los dispositivos interrumpen al cpu a través del PIC.

Es el intermediario entre los dispositivos que quieren interrumpir y la cpu. Avisa a la cpu que tiene que frenar, se maneja desde la memoria de E/S así que para configurar haremos uso de IN y OUT. Tambien permite configurarr el resto de cosas que nos quedaron pendientes. Las sentenicas CLI y STI bloquean y habilitan, respectivamente, las interrupciones. Cuando configuremos el PIC siempre debemos hacerlo entre CLI y STI

image

interrupciones

EOI_20H

MOV AL, 20H
OUT 20H, AL ;EOI = 20H

IMR_21H

digitos

VECTOR_DE_INTERRUCIONES

Hemos visto que existen dos tipos de interrupciones, por hardware y por software, que son necesarios por razones distintas. En las interrupciones por hardware, el que interrumpe es un dispositivo y la CPU pasa el control a una subrutina especial llamada manejador de interrupciones para atenderlo. En las que son por software, el que interrumpe es el mismo programa, y la CPU pasa el control al sistema operativo que lo atiende ejecutando una subrutina de sistema.

TIMER

Es otro dispositivo de E/S como el F10. Se utiliza como reloj despertador para la CPU. Se configura para contar una cantidad determinada de segundos y cuando finaliza la cuenta emite una interrupcion. Tiene dos registros CONT y COMP, con direcciones de la memoria E/S 10H y 11H, respectivamente

regis

CLI
 MOV AL, 11111101b ;Activamos el timer
 OUT 21H, AL ; PIC: registro IMR
 MOV AL, 10
 OUT 25H, AL ; PIC: registro INT1 (Timer)
 MOV AL, 10 ;ES 10, POR SI LO CAMBIO
 OUT 11H, AL ; TIMER: registro COMP 
 MOV AL, 0
 OUT 10H, AL ; TIMER: registro CONT
STI

F10

Contar las veces que se presionó la tecla F10 en DL

Vamos a realizar los siguientes pasos:

Parte 1 Parte 2
```Assembly ORG 2000H ;SELECCIONAR ID 10 PARA EL F10 ;CONFIGURAMOS EL VECTOR DE INTERRUPCIONES MOV AX, CONTAR ;AX = Dir de CONTAR(3000H) MOV BX, 40 ;10 * 4 en el Vec. de Int. MOV [BX], AX ;EN LA POSICION 40 PONE EL 3000H ;CONFIGURAMOS EL PIC CLI MOV AL, 11111110B ;Configuramos solo el INT0 (F10) OUT 21H, AL ;IMR MOV AL, 10 OUT 24H, AL ;ID 10(PUEDE SER CUALQUIERA) STI LOOP: JMP LOOP ;LOOP INFINITO INT 0 END ``` ```Assembly ORG 3000H ;Subrutina que atiende a la F10 CONTAR: INC DL ;AVISAR AL PIC QUE TERMINAMOS! MOV AL, 20H OUT 20H, AL ;VOLVEMOS IRET ```

HANDSHAKE

Es una abstracción de la impresora, la impresora va a generar una comunicación con este. Nos interrumpe a través del pic.

handd

ESTADO: Tiene 8 bits como todas las celdas de memoria. Estos bits tienen diferentes significados dependiendo de si los pusimos en ENTRADA o SALIDA. | ENTRADA | SALIDA | | ————- | ————- | | END | SALIDA2 |

IMPRIMIR_POR_CONSULTA_DE_ESTADO

PROGRAMA PRINCIPAL DATOS FUNCIONAMIENTO
```Assembly ORG 2000H ;CONFIGURO EL HANDSHAKE PARA EL POOLING IN AL, HAND_ESTADO AND AL, 01111111B ;7FH MODIFICO SOLO EL ULTIMO BIT OUT HAND_ESTADO, AL ;ESTADO = 0XXXXXXX ;RECORREMOS EL MENSAJE Y LO ENVIAMOS POR CARACTER A LA IMPRESORA MOV BX, OFFSET MENSAJE ;PARA RECORRER EL MENSAJE ;DESOCUPO LA IMPRESORA POLL: IN AL, HAND_ESTADO ;TOMO EL ESTADO ACTUAL AND AL, 1 ;CHEQUEO EL PRIMER BIT JNZ POLL ;MIENTRAS SEA 1 SIGO EN EL LOOP ; IMPRIMO MOV AL, [BX] ;TOMO EL CARACTER OUT HAND_DATO, AL ;LO ENVIO AL REGISTRO DE DATOS ; AVANZO INC BX ;AVANZO A LA SIGUIENTE POSICION CMP BX, OFFSET FIN ;CHEQUEO SI LLEGUE AL FINAL JNZ POLL INT 0 END ``` ```Assembly HAND_DATO EQU 40H HAND_ESTADO EQU 41H ORG 1000H MENSAJE DB "HOLA" FIN DB ? ``` ![Tiempo](https://user-images.githubusercontent.com/55964635/135734418-4ba8d65b-a24e-4796-8adf-cdf9ac7e0c4d.gif)

IMPRIMIR_POR_INTERRUPCION

PROGRAMA PRINCIPAL DATOS FUNCIONAMIENTO
```Assembly ORG 2000H ;CONFIGURO EL VECTOR DE INTERRUPCIONES. ID = 9 MOV AX, IMPRIMIR MOV BX, 36 ;9*4 = 36 MOV [BX], AX ;CONTADOR MOV BX, OFFSET MENSAJE ;PARA COMENZAR EL CONTEO MOV DL, OFFSET FIN - OFFSET MENSAJE ;CONFIGURO PIC CLI MOV AL, 11111011B ;SOLO HANDSHAKE HABILITADO (0FBH) OUT 21H, AL ; IRM MOV AL, 9 ; ID = 9 OUT 26H, AL ; MANDO LA ID AL INT2 (HANDSHAKE) ;CONFIGURO EL HANDSHAKE PARA LA INTERRUPCION OR AL, 10000000B ; MANDO UN 1 AL MENOS SIGNIFICATIVO OUT 41H, AL ; ACTIVO EL HANDSHAKE COMO INTERRUPCION STI ;SIMULAMOS UN PROGRAMA EN EJECUCION POLL: CMP DL, 0 ; CHEQUEO QUE SE TERMINO EL CONTADOR JNZ POLL IN AL, 41H AND AL, 7FH ; 0111 1111 OUT 41H, AL ; DESACTIVO EL HANSHAKE COMO INTERRUPCION INT 0 END ``` ```Assembly ORG 1000H MENSAJE DB "HOLA" FIN DB ? ORG 3000H ;RECORREMOS EL MENSAJE Y LO ENVIAMOS POR CARACTER IMPRIMIR: PUSH AX MOV AL, [BX] OUT 40H, AL ;AVISO AL PIC Y VUELVO INC BX DEC DL JNZ CONTINUAR ;DESACTIVO HANDSHAKE POR INTERRUPCION MOV AL, 01111111B OUT 21H, AL ;___________________________________ CONTINUAR: MOV AL, 20H OUT 20H, AL POP AX IRET ``` ![Tiempo](https://user-images.githubusercontent.com/55964635/135734418-4ba8d65b-a24e-4796-8adf-cdf9ac7e0c4d.gif)

Impresora_Por_Pio

Memoria Dispositivos
PIOOO

Registro de Estado: Veamos cuáles bits del registro estado son de entrada y cuáles de salida..

busi2

Ejemplo: Escribir un programa que envíe datos a la impresora a través del PIO.

;CONFIGURACION BASE DEL PIO
MOV AL, 11111101B ;STROBE DE SALIDA, BUSY DE ENTRADA
OUT 32H, AL       ;CA

MOV AL, 0         ;TODOS DE SALIDA
OUT 33H, AL       ;CB
;RECORREMOS EL STRING
MOV BX, OFFSET MENSAJE
POLL: IN AL, 30H         ; CHEQUEAMOS EL ULTIMO BIT EN PA
  AND AL, 1              ; CUANDO ESTA EN 0, SIGNIFICA QUE ESTA LIBRE LA IMPRESORA
  JNZ POLL               ; MIENTRAS NO ESTE LIBRE, SIGO CONSULTANDO
;LA IMPRESORA ESTA LIBRE
MOV AL, [BX]            ; EN PB PONGO EL DIGITO ACTUAL
OUT 31H, AL             ; MANDO A LA IMPRESORA EL DIGITO ACTUAL (AL PUERTO DE DATOS)

COMO ESTAMOS TRABAJANDO CON LA IMPRESORA POR PIO, TENEMOS QUE MANDAR LOS DATOS MANUALMENTE, TENEMOS QUE MANDAR LA SEÑAL DE STROBE, QUE ES LO QUE AVISA QUE DEJAMOS UN CARACTER EN PB

;MANDO STROBE EN 1  (ESTO SIRVE PARA IMPRIMIR EL DATO)
IN AL, 30H
OR AL, 2            ; FUERZO EL STROBE A 1
OUT 30H, AL         ; MANDAMOS EL STROBE AL PUERTO DE ESTADO (PA)

;MANDO STROBE EN 0 (ESTO SIRVE PARA VOLVER AL ESTADO Y DETECTAR SI EN EL PROXIMO CARACTER DEBE IMPRIMIRSE)
IN AL, 30H
AND AL, 0FDH      ; FUERZO EL STROBE A 0
OUT 30H, AL       ; MANDAMOS EL STROBE AL PUERTO DE ESTADO (PA)
;FIN DEL BUCLE, HASTA LLEGAR AL FIN
INC BX
CMP BX, OFFSET FIN
JNZ POLL
PROGRAMA PRINCIPAL FUNCIONAMIENTO
```Assembly ORG 1000H MENSAJE DB "AQUITECTURA" FIN DB ? ORG 2000H MOV AL, 11111101B ;STROBE DE SALIDA, BUSY DE ENTRADA OUT 32H, AL ;CA MOV AL, 0 ;TODOS DE SALIDA OUT 33H, AL ;CB IN AL, 30H ;poner el strobe en 0 AND AL, 0FDH OUT 30H, AL ;RECORREMOS EL STRING MOV BX, OFFSET MENSAJE POLL: IN AL, 30H AND AL, 1 JNZ POLL ;MIENTRAS NO ESTE LIBRE, SIGO CONSULTANDO ;LA IMPRESORA ESTA LIBRE MOV AL, [BX] OUT 31H, AL ;MANDO STROBE EN 1 IN AL, 30H OR AL, 2 ;TOMAMOS EL ESTADO OUT 30H, AL ;MANDO STROBE EN 0 IN AL, 30H AND AL, 0FDH OUT 30H, AL INC BX CMP BX, OFFSET FIN JNZ POLL INT 0 END ``` ![ARGGGG](https://user-images.githubusercontent.com/55964635/135734492-46596c0f-072d-4d64-8e5e-ada58d98e03e.gif)