Anda di halaman 1dari 11

Interrupciones en Modo Legacy

Parte prctica Referencia: Captulo 6 del manual 3A

Ing. Pablo Sebastin Sanchez

Escribimos la IDT
idt: exc00: dw 0 ;limite parte baja dw seg_code ;selector de segmento db 0 ;byte en 0 db 10000110b ;atributos P=1,DPL=00,0,D=0 (puerta de 16bits),110 => Puerta de IRQ dw 0 ;limite parte alta exc01: dw 0 ;limite parte baja dw seg_code ;selector de segmento db 0 ;byte en 0 db 10001110b ;atributos P=1,DPL=00,0,D=0 (puerta de 32bits),110 => Puerta de IRQ dw 0 ;limite parte alta . . .

No nos olvidamos del IDTR


idtr dw 8*34 - 1 dd 0

Restamos uno porque cuenta desde cero Cantidad de Descriptores Bytes que ocupa cada descriptor

Generamos el handler
exc00_handler: pushad mov bl,0x31 ;cargo el al para identificar la excepcion jmp handler_out ;salto a la salida general exc01_handler: handler_out: ;todas las excepciones continuan ac xor eax,eax mov ax,video ;ver descriptor de cada uno mov es,ax mov si,80*2*2 ;fila 20 de la pantalla: 80 col * 2 bytes * Nfilas mov byte[es:si],bl ;numero de excepcin en pantalla mov al,20h ;informa cuando finaliza la rutina de interrupcin out 20h,al ;informa cuando finaliza la rutina de interrupcin popad ;recupero los registros iret

Handler del teclado (ejemplo)


teclado_handler: pushad ;cargo en pila los registros de propsitos generales xor eax,eax mov ax,video mov es,ax mov si,80*2*20 ;fila 20 de la pantalla: 80 col * 2 bytes * N filas in al,60h dec al mov[tecla],al jz es_escape mov al,[tecla] cmp al,23h jz es_jota mov al,[contar] inc al mov [contar],al mov byte[es:si],al mov al,20h ;informa cuando finaliza la rutina de interrupcin out 20h,al ;informa cuando finaliza la rutina de interrupci popad ;recupero los registros iret

En el cdigo principal
cli ;deshabilito interrupciones ;//////////////////////////////////////////////////////////////// ;---Cargo los handler--;//////////////////////////////////////////////////////////////// mov ax,exc00_handler ;tomo el offset del handler mov word[exc00],ax ;lo cargo en el descriptor Hago lo mismo para cada Excepcin

Cargamos el IDTR
xor eax,eax ;eax=0 mov ax,cs ;cargo ax con cs shl eax,4 ;shift left 4 mov ebx,eax ;guardo una copia en ebx add eax,idt mov dword [idtr+2],eax ;cargo la base de idtr lidt [idtr] ;cargo el registro idtr

Reprogramo los PIC (1)


;Inicializo pic 1 mov al,11h ;ICW1: IRQ por flanco, modo cascada, ICW4 si. out 20h,al mov al,20h ;ICW2: INT base para el pic 1, Tipo 20h. out 21h,al mov al,04h ;ICW3: Pic 1 es master, y tiene un slave conectado a IRQ2 (0000 0100b). out 21h,al mov al,01h ;ICW4: Modo no buffered, fin de IRQ normal, procesador 8086. out 21h,al ;Deshabilito el pic 1 para inicializar el 2 mov al,0FFh ;OCW1: Set o clear el IMR. out 21h,al

Reprogramo los PIC (2)


;Inicializo pic 2 mov al,11h ;ICW1: IRQ por flanco, modo cascada, ICW4 si. out 0A0h,al mov al,28h ;ICW2: INT base para el pic 1, Tipo 28h. out 0A1h,al mov al,02h ;ICW3: Pic 2 es slave, IRQ2 es la linea que envia al mastery (010b). out 0A1h,al mov al,01h ;ICW4: Modo no buffered, fin de IRQ normal, procesador 8086. out 0A1h,al

Habilitamos la/s interrupcin/es que usamos


xor eax,eax in al,21h ;guardo la configuracin del pic mov byte [real_pic], al mov al,11111101b ;habilito la interrupcin de teclado out 21h,al ;la cargo

Finalmente
Dentro de Modo protegido habilitamos las interrupciones con: sti

Anda mungkin juga menyukai