ejemplos modo protegido.pdf

Vista previa de texto
sti
;
; Se espera que el scancode sea igual a 1,2,3, o sea, que se presione la
; tecla escape, 1 ó 2.
;
esperar:
cmp byte [cs:scan_code],1
je volver_a_modo_real
;
; Si la tecla presionada es el escape, se sale a modo real directamente.
;
cmp byte [cs:scan_code],2
je write_cs
;
; Si la tecla presionada es el 1, se intenta escribir en el cs,
; generando una excepción de protección general.
;
cmp byte [cs:scan_code],3
je invalidopcode
;
; Si se presiona la tecla 2, se intenta ejecutar una instrucción
; inválida generando una excepción de instrucción inválida, de lo
; contrario, se sigue esperando una tecla.
;
jmp esperar
;
; Se intenta escribir un 0 en el offset de scancode del cs.
;
write_cs:
mov byte [cs:scan_code],0
;
; Para ejecutar una instrucción inexistente, se puede armar una que no
; esté, o bien ejecutar UD2 (Intel define que nunca lo utilizará como
; instrucción).
;
invalidopcode:
ud2
;
; A la siguiente instrucción se llegará por el salto que se realiza al
; terminar el análisis de la excepción. Para demostrar esto, se puede
; introducir un cli y un jmp $ y verificar que nunca se ejecutan, ya que
; se bloquearía el sistema.
;
cli
jmp $
volver_a_modo_real:
cli
;
; Se cargan todos los selectores con el valor recomendado por Intel.
;
mov ax,20h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
;
; Se retorna modo real.
;
mov eax,cr0
and al,0feh
