ejemplos modo protegido.pdf

Vista previa de texto
; mismos no apuntan ya a la base física dividido 16, sino que tienen un
; campo índice y uno tabla, que hacen referencia a una de dos tablas,
; que pueden ser la GDT o la LDT, ambas de descriptores. Los
; descritpores pueden ser de segmentos del sistema, según el campo S. Si
; son descriptores de segmentos pueden ser apuntados por CS,DS,ES, FS,
; GS y SS; en caso contrario tendrán otras finalidades que veremos más
; adelante.
;
; Siendo el objetivo de este problema leer el BIOS, que se encuentra en
; los últimos 64 Kbytes de memoria, se debe armar un segmento que apunte
; a ese sector de memoria física. Para eso se debe armar un descriptor
; que apunte a ese sector de memoria y cargar el selector que direcciona
; al descriptor. De esta forma se podrá leer el BIOS y copiarlo debajo
; del mega de memoria para así grabarlo en un archivo.
;
; Para grabar un archivo bajo DOS se utilizan las funciones de DOS (int
; 21h).
;
; Crear o truncar un archivo Int 21 ah=3C.
; CX = file attributes, 0 es un archivo normal.
;
DS:DX -> ASCIZ filename
;
Return ax=handler
;
; Cerrar un archivo Int 21 ah=3E.
; bx=handler
;
; Escribir en un archivo Int 21 ah=40.
; bx=handler
; cx=cantidad de bytes
; ds:dx -> datos a escribir
;
org 100h
comienzo:jmp inicio
;
archivo
db
'bios.dat',0
;
; Aquí se define un nombre para el archivo, que debe terminar en NULL,
; porque así interpreta el DOS el fin del nombre (no se lo debe
; confundir con cómo interpreta el fin de línea para imprimir un
; string).
;
gdtr
dw 8*3-1
dd 0
;
; Hasta aquí se trataron la GDT y la LDT, que tienen descriptores (que
; son de 8 bytes) y que los selectores deben hacer referencia a algún
; descriptor. Sin embargo no se mencionó en qué posición de memoria se
; encuentran estas tablas y el procesador no lo puede adivinar. Para
; ello existe un registro llamado GDTR (Global Descriptor Table
; Register) formado por 6 bytes, que indica, en 1 word, el largo menos 1
; de la tabla y, en un double word, la base lineal de la tabla (para la
; LDT se utiliza otro método que no se estudiará aquí). Se coloca el
; largo, se indica 8 por el largo de cada descriptor, 3 porque se quiere
; utilizar 3 de ellos y –1 por la definición de límite.
;
; Al colocar la base pueden surgir dudas. ¿Dónde esta la base de la GDT?
; Se sabe dónde comienza: en gdt: (ver abajo). Pero, ¿dónde quedará
; esa posición cuando el DOS o algún loader cargue el programa? Es
; imposible saber esto de antemano, por lo cual se debe cargar la base
; en tiempo de ejecución. Como el programa comienza a ejecutarse en modo
; real, el CS es la base sobre 16 y el offset es gdt:. Para conocer la
