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 ``` |
La memoria E/S es igual a la memoria común! Como son iguales, necesito de un mecanismo para distinguirlas :
IN
, para escribir en ella OUT
. Ambas instrucciones solo se pueden usar con el registro AL
IN AL, 40H
OUT 50H, AL
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)
Es un puerto paralelo de E/S
Contra de 2 puertos paralelos configurables.
Ocupa 4 celdas en la memoria de E/S:
PA Y PB
CA Y CB
Memoria | Dispositivos |
---|---|
Salida
y 1 para que sea de Entrada
Ej. Queremos que el PA
tenga todos los bits como entrada excepto el menos significativo
CA
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 ``` |
Nos vamos a manejar con 4 dispositivos externos.
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
MOV AL, 20H
OUT 20H, AL ;EOI = 20H
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.
ID*4
del vector de int.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
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
Contar las veces que se presionó la tecla F10 en DL
Vamos a realizar los siguientes pasos:
IRET
)Vector de Interrupciones
PIC
CLI
STI
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 ``` |
Es una abstracción de la impresora, la impresora va a generar una comunicación con este. Nos interrumpe a través del pic.
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 |
| ————- | ————- |
| | |
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) |
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) |
Memoria | Dispositivos |
---|---|
Registro de Estado: Veamos cuáles bits del registro estado son de entrada y cuáles de salida..
Bit 0 (busy)
: 1 si está ocupada la impresora, 0 si está libre. (ENTRADA)Bit 1 (strobe)
: seteando el bit en 1 le avisamos a la impresora que dejamos un caracter en DATO para que lo imprima. (SALIDA)PA
Ejemplo: Escribir un programa que envíe datos a la impresora a través del PIO.
Strobe en 0 (salida) y Busy en 1(entrada)
Todos de salida!
Chequear si el bit Busy = 0
DEL PUNTO 3 AL 6 DEBEMOS REPETIRLO PARA CADA CARACTER
;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) |