Elias Hernandis - 21 Jan 2020
END
. Si va seguida de una etiqueta, la ejecución comienza en dicha etiqueta (T2.5, p.32)_nombre
.FAR
para procedimientos (la dirección de retorno son 4 bytes) y los punternos son de 4 bytes. Si el modelo es corto entonces se utiliza NEAR
(la dirección de retorno son 2 bytes) y los punteros son de 2 bytes.AX
. Si devuelve dos palabras, lo hace en DX:AX
.void
).CMP
en vez de SUB
y TEST
en vez de AND
para las condiciones para saltar.CMP
ni SUB
si se va a comparar con 0
o con el signo y si sobre lo que se va a comparar ha sido utilizado en la última operación aritmética o lógica (las flags se mantienen para que las use la instrcción de salto).BYTE PTR
porque por defecto coge una palabra.VARIABLE db/dw
).add sp, N
(N entero) para limpiar la pila antes de retornar en el primer procedimiento. No se pueden utilizar pop
s porque contaminarían los registros.jmp
a etiquetas que están justo debajo no hacen falta (basta con dejar que siga).INC
s y DEC
s que suelen estar cambiados.char
de la pila que hemos pasado por parámetros descartamos la parte más significativa (que deberían ser ceros y está en la dirección más baja por ser little endian).Ejercicios 3.3, 3.12, 3.22.
Dende del número de interrupción:
08h - 0Fh
: la interrupción está asociada al PIC maestro (PIC 0). Hay que mandar el EOI al PIC maestro que se encuentra en el puerto 20h
.
70h - 7fh
: la interrupción está asociada al PIC esclavo (PIC 1). Hay que mandar el EOI tanto a maestro como a esclavo (puerto 0A0h
).
En otro caso: la interrupción no está asociada a ningún PIC. No hay que mandar EOIs.
Ver 5.5 § XVI y XVII para más detalles y una tabla con los periféricos asociados a las interrupciones que pasan por PICs.
¿EOI específico o no específico? TL;DR: no específico. Explicación: el EOI específico indica cómo se debe actualizar la tabla de prioridad de interrupciones en los PICs. Salvo que se diga lo contrario (no se dice en las diapositivas) se manda el EOI no específico que es el 20h
(sí, coincide con el puerto del PIC maestro pero son cosas distintas).
Nota: el EOI se manda escribiendo en el puerto correspondiente: MOV AL, 20h, OUT 0A0h, AL
.
El RTC dispone de 64 bytes de memoria de los cuales 4 son de control. Se organizan en 4 registros (0Ah, 0Bh, 0Ch, 0Dh
) que configuran distintas funcionalidades (Ver 6.3 § III-VIII).
Ver 6.3 § II.
Escribir (OUT
) en el puerto 70h la dirección del registro de control al que accederemos (guardando dicha dirección en AL
).
Acceder al registro (IN/OUT
) a través del puerto 71h y utilizando AL
de nuevo para la escritura/lectura de datos.
Ejercicios 3.5, 3.18.
Nota: no siempre es posible obtener interrupciones a \(f\) Hz pero podemos aproximarnos bastante. Además, \(f\) no puede ser menor que 2 Hz por lo que si necesitamos menos frecuenciatendremos que programar el RTC a 2Hz, contar las interrupciones recibidas y actuar solamente cada \(2f\) interrupciones.
DV
y RS
para configurar el registro A
.
DV
es el número de reloj con la frecuencia inmediatamente superior a la \(f\) deseadaRS
se obtiene de redondear \(1 + \log_2 \frac{CLK}{f}\). Es necesario comprobar que dicho número cabe en 4 bits (nosotros al programarlo, no mediante ensamblador). Si no cabe porque es muy pequeño, hay que elegir un reloj más rápido. Si no, uno más lento.PIE
) del registro B.Un ejemplo:
MOV AL, 0AH
OUT 70H, AL
IN AL, 71H
TEST AL, 10000000B
JNZ NO_SE_PUEDE_CONFIGURAR
MOV AL, 00101110B ; EL REGISTRO B DEL RTC
OUT 71H, AL
MOV AL, 0BH
OUT 70H, AL
IN AL, 71H ; LEER REGISTRO B
OR AL, 01000000B ; MODIFICAR BIT PIE
OUT 71H, AL
Ejercicios 3.11, 3.20, 3.21, 3.25.
Hay que hacer 4 cosas: la primera y la última como siempre pero las dos centrales son específicas del RTC en el primer caso y de los periféricos que van por PIC en el segundo.
Activar las interrupciones y guardar registros.
Leer el registro C
del RTC para restearlo y que se generen las siguientes interrupciones (Ver 6.3 § VIII y IX).
C
está a 1. (Ver 6.3 § VIII).Enviar EOIs no específicos a PIC maestro y esclavo.
Limpiar registros y hacer IRET
.
Un ejemplo:
RSI PROC FAR
STI
PUSH ...
MOV AL, 0AH
OUT 70H, AL
IN AL, 71H
; código de la interrupción
MOV AL, 20H
OUT 20H, AL
OUT 0A0H, 20H
POP ...
IRET
RSI ENDP
LPTX
)El puerto paralelo tiene 3 registros (datos, estado, control) que se corresponden con 3 puertos. Los números de puerto para un LPT están almacenados en un offset de memoria del segmento 0. Ver 6.5 § IV para averiguar las direcciones base.
Ejercicio 3.23.
Los pines 2-9 del conector externo DB-25 se corresponden con los bits del registro de datos pero en orden inverso. Ver 6.5 § VI.
Para leer/escribir en el registro de estado necesitamos el puerto asociado:
DX
.IN AL, DX
)AL
y escribir.Un ejemplo:
MOV AX, 0
MOX ES, AX
MOV DX, ES:[040Ah]
IN AL, DX
; modificar AL (o escribir directamente)
OUT DX, AL
Ejercicios 3.13, 3.21.
Se hace igual pero hay que tener en cuenta dos cosas
Los puertos de estos registros están también en memoria pero en lugar de en la dirección base que aparece en 6.5 § IV, en dirección base + 1
o dirección base + 2
, respectivamente. Ver 6.5 § V.
Algunos bits de estos registros están invertidos. Esto significa que si queremos poner un 1 necesitamos escribir un 0 o viceversa. Ocurre lo mismo al leer. Los bits que se invierten están especificados con la etiqueta (inv)
en 6.5 § VII y VIII.