ejemplos modo protegido.pdf

Vista previa de texto
mov al,0dfh
out 60h,al
;Eanble A20
;
; A20 hace referencia a una AND que funciona como habilitación de la
; línea 20 del bus de direcciones. Cuando el A20 está en 0, la línea 20
; del bus de direcciones es cero siempre; cuando A20 está en 1, la línea
; A20 del bus de direcciones es la que corresponde según la referencia a
; memoria física que se haga. Si se intenta acceder a la dirección
; 3FFFFFh con la A20 en cero, se accederá a la dirección 2FFFFFh, o sea
; que el bit 20 de las direcciones es colocado en cero por la AND.
;
; La AND en el Address Bus 20 fue colocada por compatibilidad con la
; 8086. En el 8086 el micro, al direccionar la posición de memorias
; superiores al mega (por ejemplo haciendo al segmento igual a 0FFFFh y
; el offset mayor a 0Fh), se direcciona nuevamente; la parte baja de
; memoria. Por ejemplo para direccionar el primer byte físico de la RAM
; se puede hacer con DS en cero y offset 0, o bien con DS en FFFFh y
; offset 10h. En los procesadores posteriores al 8086, estando en modo
; real y colocando DS en 0FFFFh y el offset en 10h, se accede al byte
; físico 100000h y no al 0h. Esto implica una incompatibilidad, por la
; cual se colocó la AND.
;
; La existencia de esta AND hace colocar en 1 la entrada de control,
; para poder acceder a los megas impares de memoria (todos los que
tengan
; en 1 el bit 20 del bus de direcciones). Para evitar complicaciones, al
; utilizar memoria superior al mega, se habilita
; la A20.
;
;mov al,0D1h
;out 64h,al
;mov al,0ddh
;out 60h,al
;Disable A20
;
; Éste es el procedimiento para inhabilitar la A20. A pesar de que no
; se use en este ejemplo, se lo deja planteado. Se debe tener en cuenta
; que a veces programas residentes de modo real utilizan la memoria
; entre 0FFFFh:10h y 0FFFFh:0FFFFh, por eso es recomendable no modificar
; esta sección de memoria.
;
xor eax,eax
;pone en cero eax.
mov ax,cs
;carga el cs en eax.
shl eax,4
;en eax=base lineal de cs.
mov ecx,eax
;almacena en ecx la base lineal de cs.
;
; Como se indicó anteriormente, para colocar en el GDTR y en el
; descriptor 10h se debe conocer la base lineal en la que el DOS cargó
; el código. Para eso, estando todavía en modo real, se lee el CS y se
; lo multiplica por 16 (que es lo mismo que hacer 4 veces un shift a la
; izquierda). Este valor debe ser almacenado en ecx y eax.
;
; Luego, con el valor de ecx, que es la base del segmento de código, se
; puede calcular la base de la GDT para colocar en el GDTR.
;
add ecx,gdt
;ecx=base lineal gdt
mov [gdtr+2],ecx
;carga la base de GDTR
lgdt [gdtr]
;carga el GDTR
;
; Con las primeras dos instrucciones se completó el campo de base del
; GDTR. Una vez realizado esto se debe cargar estos 6 bytes dentro del
; registro de la PC, para lo que existe la instrucción lgdt. También
