ejemplos modo protegido.pdf


Vista previa del archivo PDF ejemplos-modo-protegido.pdf


Página 1...28 29 30313291

Vista previa de texto


; de datos y de códigos, se debe inicializar la base de los mismos en
; tiempo de ejecución. Para eso se multiplica por 16 el valor del
; segmento de código y se almacena una copia en ebx.
;
mov [seg_cod+2],ax
mov [seg_datos+2],ax
;
; En los bytes 2 y 3 de ambos descriptores se almacena la parte baja de
; la base.
;
shr eax,16
mov [seg_cod+4],al
mov [seg_datos+4],al
;
; Después se realiza un desplazamiento para colocar la parte alta de la
; base y cargar el 3er byte. No es necesario inicializar la parte más
; alta (últimos 8 bits), ya que la posición del CS en modo real nunca
; podrá exceder 0FFFFh, lo cual, multiplicado 16 veces, puede llegar a
; ser 0FFFF0h. Nunca un bit mayor al 19 estará seteado.
;
;--- Se inicializa el GDTR.
mov eax,ebx
add eax,gdt
mov [gdtr+2],eax
lgdt [gdtr]
;se carga el GDTR.
;
; En ebx se almacenó una copia de la base del segmento. Si a ésta se le
; suma el offset de la gdt, se obtiene la posición lineal de la misma
; para almacenar en el GDTR. Luego se carga el GDTR.
;
;--- Se inicializa la IDT.
mov ax,irq0_han
mov [irq0],ax
;
; En el descriptor de irq0 se debe colocar el offset. En este caso, el
; offset será respecto a la base del segmento de código que se utilizó.
; Como el mismo tiene una base igual a la de modo real, se utiliza el
; offset irq0_han directamente.
;
;--- Se carga la IDT.
sidt [real_idtr]
mov eax,ebx
add eax,idt
mov [idtr+2],eax
lidt [idtr]
;
; Con el IDTR se debe realizar una operación similar a la del GDTR y,
; como en ebx, se tiene todavía la base lineal del segmento de códigos.
; A este valor se le suma el offset de la idt y se almacena el valor en
; el IDTR. Luego se carga el IDTR.
;
;--- A modo protegido
cli
mov eax,cr0
or al,1
mov cr0,eax
;
; Dado que éste ya es el tercer ejemplo de modo protegido, no es
; necesario explicarlo.
;
jmp 08h:modo_protegido