ejemplos modo protegido.pdf

Vista previa de texto
;
; Aquí hay algo nuevo. Como siempre, luego de pasar a modo protegido,
; se realiza un salto. Sin embargo esta vez, como el salto es largo, la
; sintaxis es distinta. Primero se indica el selector y luego el offset.
;
modo_protegido:
;--- Se carga el segmento de datos.
mov ax,10h
mov ds,ax
;
; Se carga el selector que apunta al descriptor del segmento de datos
; imagen del de código. Para poder acceder a las variables que están
; después del jmp inicio y antes del label inicio:
;
;--- Se guarda el PIC de modo real y se carga el de modo
;protegido.
in al,21h
mov [mask_real_pic1],al
mov al,011111110b
out 21h,al
;
; Ahora se almacena el estado de la máscara del PIC en una variable,
; para luego, antes de retornar al DOS, dejar las mismas intactas. Y se
; coloca en el PIC la nueva máscara habilitando únicamente la irq0.
;
sti
;no olvidar setear las interrupciones.
esperar:
cmp byte [cs:scan_code],1
jne esperar
;
; Luego se habilitan las interrupciones y se espera un scancode igual a
; 1. Si llega dicho scancode se comienza el retorno a modo real.
;
cli
;--- Se carga en todos los selectores un segmento de 64 Kb de
; límite.
mov ax,20h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
;--- Se retorna a modo real.
mov eax,cr0
and al,0feh
mov cr0,eax
;se pasa a modo real.
db 0eah
;código del salto.
dw modo_real
real_cs dw 0
;
;
;
;
;
;
;
;
;
;
;
El retorno a modo real no es mucho más complicado que en el ejemplo
anterior. En esta ocasión, debido a que se modificó el cs al entrar en
modo protegido, se debe realizar un salto lejano para retornar a modo
real. El salet debe ser al offset modo_real:, o sea, a la instrucción
siguiente. Como el compilador no puede interpretar un jmp a esta
dirección, se lo realiza manualmente. Para ello se debe conocer el
código de la instrucción jmp far, que es 0eah. Luego del código de la
instrucción se debe colocar el offset y el selector. Como offset se
coloca el de la siguiente instrucción, el label modo_real. Como
selector se utiliza una variable que se carga en el inicio del
