ejemplos modo protegido.pdf


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


Página 1...27 28 29303191

Vista previa de texto


mov al,20h
out 20h,al
;
;
;
;
;
;
;
;

IMPORTANTE: Este paso es un error típico y genera muchos dolores de
cabeza. El PIC nunca ejecuta una interrupción mientras esté sucediendo
otra de mayor prioridad. Por eso es que por soft se le debe informar
cuándo la rutina de interrupción a finalizado. Para ello se debe
enviar un valor 20h al puerto 20h, de lo contrario nunca más se
ejecutará una irq0 (hasta resetear).
popad
pop ds
iret

;
; Se recuperan los registros y se retorna de la interrupción.
;
inicio:
;
; Aquí comienza el programa principal.
;
smsw ax
;
; Lo primero es verificar si se está en modo protegido, para lo que se
; lee el bit 0 del CR0. Pero leer el CR0 en nivel 3 estando en modo
; protegido genera una excepción, por eso se utiliza la instrucción smsw
; (store machine status word), que almacena los 16 bits bajos en el
; registro destino. A modo informativo: también existe una instrucción
; lmsw que cumple la función inversa, o sea, carga los 16 bits bajos de
; CR0 con el contenido del registro origen.
;
test al,1
;
; Se verifica el bit 0, que indica si se está en modo protegido o no.
;
jz en_modo_real
mov ah,09h
mov dx,modo_virtual_msg
int 21h
mov ah,4ch
int 21h
;
; Si se está en modo real, se imprime el mensaje de error y se retorna
; al DOS.
;
en_modo_real:
;--- Guardo el cs de modo real
mov [real_cs],cs
;
; En este ejemplo se utilizó un segmento de código de modo protegido.
; Por eso, al regresar a modo real, se necesitará el valor del selector
; de modo real, que se puede recuperar de varias formas. La más sencilla
; es directamente guardarlo en una variable.
;
;--- Se acomoda el CS
xor eax,eax
;eax=0
mov ax,cs
;almacena CS en eax.
shl eax,4
;en eax=base lineal de CS.
mov ebx,eax
;se guarda en ebx.
;
; Como se indica en la definición de los descriptores de los segmentos