¿Que manera mas sencilla que cli/sti propones?
Antes del ejemplo que muestras en seguida se me ocurria salvar todos los registros en la rutina del ISR para que asi, al terminar, los registros continuasen con su valor original (en la cadena de "valores originales") tal como el sistema operativo salva un PCB antes de
entrar en otro proceso. Sin ambargo entiendo ahora por que se desactivan las interrupciones en ese fragmento:
CLI
PUSH DS
PUSH CS
POP DS
JZ _noChar
LEA BX, _buffer
PUSH SI
MOV SI, WORD PTR [_index]
MOV BYTE PTR [BX+SI], AL
INC SI
MOV WORD PTR [_index], SI
;////////////////esta es la region critica
POP SI
MOV BX, WORD PTR [_index]
CMP BX, 32H
JB _noOverlapping
MOV AX, 0
MOV WORD PTR [_index], AX
_noOverlapping:
_noChar:
;en seguida se recupera el registro DS
Si ocurre una reentrada en ese punto, la direccion de memoria a la que hace referencia
_index podria ser incrementada dos veces si se presiona una tecla en ese preciso momento.
Y viendo el codigo dos veces estoy viendo mas de una
sección critica. Ahora si tiene sentido.
Aunque sigo con una pregunta:
¿deben todos los ISR salvar el valor de los registros que utiliza? Porque no se por que siento que en algun momento un ISR no me va a funcionar porque alguna llamada a un servicio de interrupcion va a modificar un registro que estoy a punto de utilizar. Llamame paranoico... lo soy. Solo me pregunto si como norma general los ISR deben hacer eso. De hecho tambien seria curiosidad por el funcionamiento (ademas de paranoia).
Este link lo voy a guardar. Estaba buscando algo asi desde hace rato. Muchas gracias por citarlo.
En el fragmento que dejaste no se guarda EFLAGS, pero bueno entiendo que yo tengo ese libro en papel, en realidad se empuja EFLAGS en la pila para simular el estado de llamada a una interrupcion, sino se joderia la pila cuando el codigo original de la interrupcion (o el de la int 16h) se terminara con IRET.
Esto lo lei varias veces pero no logro entender precisamente a lo que te refieres.
No se guarda EFLAGS pero eso es implicito en una llamada a una interrupcion, ¿no?.
yo tengo ese libro en papel
¿Cual libro?
se empuja EFLAGS en la pila para simular el estado de llamada a una interrupcion, sino se joderia la pila cuando el codigo original de la interrupcion (o el de la int 16h) se terminara con IRET.
Esta bien... te refieres con simular a mantener la integridad de la entrada inmediatamente anterior de la cadena de ejecucion de las interrupciones (en la pila), ¿no?.
Gracias por la ayuda y el enlace.
Saludos.