- Interrupciones por Software
- Memoria E/S y PIO
- Interrupciones por Hardware
- Handshake
- Impresora por PIO
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 |
ORG 1000H
LEIDO DB ?
ORG 2000H
MOV BX, OFFSET LEIDO
INT 6
INT 0
END |
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 :
- Para leer desde la memoria E/S usaremos
IN
, para escribir en ellaOUT
. Ambas instrucciones solo se pueden usar con el registroAL
- Ej. Lectura: Leer el dato que está en la posición 40H de E/S,
IN AL, 40H
- Ej. Escritura: Poner el valor 30 en la posicion 50H de E/S,
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:
- 2 de datos llamados
PA Y PB
- 2 de configuración llamados
CA Y CB
Memoria | Dispositivos |
---|---|
- Cada celda (Tambien llamada registro) consta de 8 bits.
- Debemos configurar cada bit de datos como entrada o salida.
- En los puertos de configuracion debemos poner un 0 para que ese bit en el puerto de datos sea de
Salida
y 1 para que sea deEntrada
Ej. Queremos que el PA
tenga todos los bits como entrada excepto el menos significativo
- Debemos configurar
CA
- Todos en 1 menos el menos significativo (11111110)
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. |
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 |
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
- El PIC nos avisa que un dispositivo nos quiere interrumpir. Nosotros le avisamos que ya atendimos la interrupcion.
- Antes de volver de la subrutina de la interrupcion debemos poner el valor 20H en el EOI.
MOV AL, 20H
OUT 20H, AL ;EOI = 20H
- Nos permite definir qué interrupciones vamos a atender y cuáles ignorar.
- 1 Significa deshabilitada, 0 habilitada
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.
- Va de la posición 0(0000H) a la 1023 (0400H)
- Consta de 1024 posiciones de memoria
- Lo usamos para asociar las interrupciones con una subrutina a ejecutar
- Seleccionar un ID es crucial ya que se usará para asociar una interrupción con una subrutina
- Cuando ocurre una interrupcion la máquina toma el ID que elegimos y busca la dirección de la subrutina a ejecutar en la posición
ID*4
del vector de int. - Solo puede manejar 256 interrupciones ya que tengo 1024 casillas y cada interrupcion ocupa 4 casillas (1024 / 4 = 256)
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:
- Escribir la subrutina que se ejecutará cuando se produzca la interrupcion (que finaliza con
IRET
) - Elegir un ID de interrupción (cualquiera menos 0, 3, 6 o 7)
- Poner la dirección de la subrutina en el
Vector de Interrupciones
- Configurar
PIC
- Bloquear las interrupciones con la sentencia
CLI
- Poner el ID en el PIC para la interrupción que nos interesa
- Desenmascarar la interrupcion.
- Desbloquear las instrucciones con la sentencia
STI
- Bloquear las interrupciones con la sentencia
Parte 1 | Parte 2 |
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 |
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 |
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 |
HAND_DATO EQU 40H
HAND_ESTADO EQU 41H
ORG 1000H
MENSAJE DB "HOLA"
FIN DB ? |
PROGRAMA PRINCIPAL | DATOS | FUNCIONAMIENTO |
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 |
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 |
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)- Cuando la impresora esta llena, manda automaticamente un 1 al
PA
Ejemplo: Escribir un programa que envíe datos a la impresora a través del PIO.
- ¿Cómo configuramos el PA a partir de CA?
Strobe en 0 (salida) y Busy en 1(entrada)
- ¿Cómo configuramos el PB a partir de CB?
Todos de salida!
- Consultaremos constantemente si está libre
Chequear si el bit Busy = 0
- Cuando la impresora esté libre mandamos el caracter a PB (31H)
- Hasta que no mandemos el bit de Strobe en 1 no se va a imprimir!
- Después de enviar el Strobe en 1, debemos volver a ponerlo en 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 |
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 |