ejemplos modo protegido.pdf

Vista previa de texto
db
db
db
db
0
10000110b
0
0
;
; La rutina de irq0 handler se ocupa de incrementar el primer byte de la
; pantalla y leer el último scancode enviado por el teclado.
;
irq1han:
push ds
push eax
mov ax,10h
mov ds,ax
;
; En la interrupción se lee el scancode del puerto 60h y se lo almacena
; en la variable correspondiente.
;
in al,60h
mov [ds:scan_code],al
mov al,20h
out 20h,al
;
;
;
;
;
;
No deben olvidarse las 2 líneas anteriores, que son las que indican al
PIC que la interrupción ha terminado. De lo contrario, no ejecutará
nunca más una interrupción, ya que no habrá otra de mayor prioridad
(ésta es la 0, que es la de mayor prioridad).
pop eax
pop ds
iret
;
; Ambas excepciones hacen lo mismo. Se necesita un método para
; distinguir cuál de ellas ha sucedido, por lo que se hace una rutina de
; 3 líneas por excepción donde se almacenan los registros en la pila y
; se coloca en eax el número de la excepción. Luego se salta, claro, a
; la rutina principal de excepción, que es común a ambas.
;
int6han:
mov dword[excepciones+excepciones_struc.excepcion],6
jmp atender_excepcion
int13han:
push eax
mov word [excepciones+excepciones_struc.errorcode?],1
mov ax,[esp+1*4]
mov [excepciones+excepciones_struc.errorcode],ax
pop eax
add esp,2
mov dword [excepciones+excepciones_struc.excepcion],13
jmp atender_excepcion
;
; La rutina de excepción guarda el estado del procesador, lo muestra en
; pantalla y retorna a modo real.
;
atender_excepcion:
call cargar_reg
call mostrar_reg
jmp volver_a_modo_real
;
; Se hace una rutina (macro) para mover ambos PICs, que recibe como
