ejemplos modo protegido.pdf

Vista previa de texto
; estarán en data_sel_3 y el resto de los registros permanecerán en 0.
;
tss_struc:
istruc tss_structure
at tss_structure.reg_ESP0,
dd 252
at tss_structure.reg_SS0,
dw stack_sel_0
at tss_structure.reg_EIP,
dd 0
at tss_structure.reg_EFLAGS,
dd 002h
at tss_structure.reg_ESP,
dd 252
at tss_structure.reg_CS,
dw code_sel_3
at tss_structure.reg_SS,
dw stack_sel_3
at tss_structure.reg_DS,
dw data_sel_3
at tss_structure.IOMAP,
dd 0ffffffffh
iend
;
; Ya que se inicializó antes en la GDT, se tendrán dos entradas al
; sistema, una para pasar a un segmento de nivel 0 y otra para pasar a
; un segmento conforming. El segmento conforming tendrá una única
; rutina, por lo que no es necesario distinguir para qué fue llamado.
; En el otro segmento sí será necesario, por lo que se definen 3
; variables con los números de servicios para no tener que recordarlos.
;
%define EXIT_SERVICE
0
%define KEY_SERVICE
1
%define TIMER_SERVICE
2
;
; La rutina de atención del "kernel" puede ser llamada de 3 formas
; distintas, en función del valor de eax.
;
kernel_routine:
cmp eax,EXIT_SERVICE
jne no_EXIT_SERVICE
;
; Si eax es igual a EXIT_SERVICE se retorna a modo real (hay que tener
; en cuenta que esto no se puede hacer desde nivel 3).
;
jmp retornar_modo_real
no_EXIT_SERVICE:
cmp eax,KEY_SERVICE
jne no_KEY_SERVICE
;
; Si eax es igual a KEY_SERVICE se retorna al último scan_code leído.
;
in al,60h
retf
no_KEY_SERVICE:
cmp eax,TIMER_SERVICE
jne no_TIMER_SERVICE
;
; Y si eax es TIMER_SERVICE se lee la hora del Real Time Clock.
;
xor eax,eax
mov al,4
out 70h,al
in al,71h
shl eax,8
mov al,2h
out 70h,al
in al,71h
shl eax,8
mov al,0
out 70h,al
