ejemplos modo protegido.pdf

Vista previa de texto
mov al,20h
out 20h,al
str ax
cmp ax,tss_sup
jne no_tarea_sup
jmp tss_inf:0
popad
iret
no_tarea_sup:
jmp tss_sup:0
popad
iret
;
; Suele ser difícil comprender el por qué el popad y el iret después del
; salto de tarea. La razón es que cuando se realiza el salto de una
; tarea a otra en el tss correspondiente a la vieja tarea, se almacena
; la dirección de la siguiente instrucción a ejecutar. Si se supone que
; la rutina int8han se ejecuta estando en la tarea superior, el
; procesador ejecutará la instrucción jmp tss_inf:0, o sea, saltará a
; la tarea inferior, y almacenará, en el tss de la tarea superior, como
; próxima instrucción a ejecutar (cs:eip), el popad siguiente. Esto es
; correcto ya que, de volver a la tarea superior, se estaría todavía en
; la rutina de interrupción vieja y se deben recuperar de la pila los
; registros y retornar a la tarea superior (las pilas de ambas tareas
; son distintas).
;
; Por otro lado, se tendrá la rutina del teclado, la cual compara el
; scancode leído con el de la tecla escape y, en caso de ser éste
; último, se vuelve a modo real.
;
int9han:
pushad
in al,60h
mov bl,al
mov al,20h
out 20h,al
dec bl
jz NEAR retornar_modo_real
popad
iret
;
; De aquí en más no se encontrará nada nuevo, sino solamente las
; inicializaciones típicas de un programa de modo protegido.
;
inicio:
;
; Se guarda el cs de modo real.
;
mov ax,cs
mov [real_cs],ax
;
; Se acomoda el descriptor de código y de datos.
;
xor eax,eax
;pone en cero eax.
mov ax,cs
;carga el cs en eax.
shl eax,4
;en eax=base lineal de cs.
mov ebx,eax
;guarda en ebx.
mov word [seg_code+2],ax
