ejemplos modo protegido.pdf


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


Página 1...25 26 27282991

Vista previa de texto


db 00000000b
db 0
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

;G AVL Límite 19:16
;Base 31:24

Como segunda entrada de la GDT se coloca el segmento de código, que
está superpuesto con el de modo real. El límite es de 65536. La
base se coloca en tiempo de ejecución, de tal forma que se superponga
con el de modo real, que es donde está el código. El segmento está
presente, es de nivel de privilegio 0, se trata de un segmento, es de
código y legible. La granularidad es cero.
Ya se ha explicado explicado antes, pero siempre es bueno refrescar.
Tal vez sea llamativo, éste es el PRIMER programa en que se utiliza
segmento de código en modo protegido. ¿POR QUÉ? Al ejecutarse una
interrupción, y al retornar de ella, se modifica tanto el CS, como el
IP. En los ejemplos anteriores no se utilizaba CS de modo protegido,
ya que se mantenía el de modo real. Ahora se modificará el CS
implícitamente cuando ocurra una interrupción, por eso se debe
utilizar un selector de modo protegido válido.
Al suceder una interrupción se cargará el nuevo segmento de código y
esto se hará de forma correcta, en la pila donde se almacena la
dirección de retorno se guarda el CS de modo real. Cuando se ejecute
un iret al finalizar la interrupción, se intentará cargar el CS con el
valor del selector almacenado en la pila, que era el de modo real, sin
embargo se cargará estando en modo protegido. Esto generará una
excepción, ya que ese selector de la GDT o LDT no existirá.

;--- 10h Segmento de datos de 64 Kb sobre el de modo real.
seg_datos:dw 0ffffh
dw 0
db 0
db 10010010b
db 0b
db 0
;
; En modo protegido no se puede escribir en el CS.
; O sea, la instrucción:
;
; mov [cs:si],al
;
; No se puede ejecutar. Entonces, si se desea modificar una variable
; sobre el code segment, se debe inicializar un segmento de datos
; superpuesto con el de código. Para ello se inicializa el segmento con
; todos sus campos menos la base, ya que la misma estará superpuesta con
; la del segmento de código.
;--- 18h Segmento de datos flat.
dw 0ffffh
;límite 15.00
dw 00000h
;base 15.00
db 000h
;base 23.16
db 10010010b
;Presente Segmento Datos Read Write.
db 10001111b
;G y límite 0Fh
db 00h
;base 31.24
;
; Este segmento flat se utiliza para agregar al programa un detalle.
; Incrementar el primer byte de la pantalla sirve únicamente para poder
; asegurar que el programa se está ejecutando correctamente.
;
;--- 20h Segmento de datos de 64 Kb.
dw 0ffffh
dw 0
db 0