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 . . .
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
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
Finalmente
Dentro de Modo protegido habilitamos las interrupciones con: sti