EEJJEEMMPPLLOOSS DDEE
MMOODDOO PPRROOTTEEGGIIDDOO
PPrrooggrraammaacciióónn eenn AAsssseemmbblleerr
MMaarriiaannoo CCeerrddeeiirroo
mm..cceerrddeeiirroo@@ssooiixx..ccoomm..aarr
11eerraa EEddiicciióónn
OOccttuubbrree ddee 22000044
BBuueennooss AAiirreess
AArrggeennttiinnaa
hhttttpp::////wwwwww..ssooiixx..ccoomm..aarr//lliinnkkss//mmppbbyyeexxaammpplleess..hhttmmll
Cerdeiro, Mariano
Ejemplos de modo protegido: programación en assembler. -1a ed. - Buenos Aires: el autor, 2004.
Internet; 91 p.
ISBN 987-43-8245-7
1. Programación-Computación I. Título
CDD 005
Todos los derechos reservados.
Esta publicación no puede ser reproducida, archivada o transmitida en forma total o parcial, sea
por medios electrónicos, mecánicos, fotocopiados o grabados, sin el permiso previo del autor.
ISBN 987-43-8245-7
A mis profesores Lic. Mirta Bindstein, Ing. Alejandro Furfaro e Ing. Marcelo Doallo.
Agradezco a Manuela Cerdeiro, mi hermana, quien tradujo el documento al español.
; Introducción
; ej00.asm - programa hola mundo
; ej01.asm - entrar y salir a modo protegido
; ej02.asm - programa que guarda el BIOS en un archivo
; ej03.asm - programa con interrupciones
; ej04.asm - excepciones en modo protegido
; ej05.asm - programa multitarea
; ej06.asm - salto de niveles de privilegio en modo protegido
; ej07.asm - modo protegido 32 bits y pila expand down
; ej08.asm - paginación
7
9
13
17
25
33
49
61
73
79
; Introducción
;
; Este libro tiene como finalidad cubrir la gran brecha existente entre
; los libros y manuales de modo protegido y lograr correr un programa
; sin que el mismo bootee la PC por algún error. Para ello se explica la
; teoría necesaria para entender el código a continuación.
;
; Cabe aclarar que este libro NO es de teoría de modo protegido, por
; ello se recomienda llevar el estudio teórico con algún otro libro del
; tema. Personalmente recomiendo los manuales de Intel, que el día de la
; fecha se encuentran en:
;
; http://developer.intel.com/design/Pentium4/documentation.htm#man
;
; De este link se pueden bajar los manuales del Pentium 4. Los
; conocimientos sobre modo protegido se pueden obtener de los capítulos
; 2, 3, 4, 5 y 6 del IA-32 Intel Architecture Software Developer's
; Manual Volume 3: System Programming Guide.
;
; Para programar en modo protegido se puede utilizar cualquier editor de
; texto, como vi, notepad, edit u otro. Para compilar se utiliza el nasm
; y para correr los programas, el bochs, con el freedos cargado en una
; imagen de disquete, o booteando la PC en modo real, ya sea mediante un
; disquete o booteando en modo real, si el sistema operativo lo permite.
;
; El nasm es un compilador de assembler, se puede bajar de:
;
; http://nasm.sourceforge.net/
;
; El bochs es una PC virtual, y es una herramienta IMPRESCINDIBLE para
; poder debugear el código de modo protegido.
;
; http://bochs.sourceforge.net/
;
; Y el Free DOS:
;
; http://www.freedos.org/
;
; La instalación de los programas dependerá del sistema operativo, del
; freedos sólo es necesario bajar la imagen e indicar en el archivo de
; configuración del bochs dónde encontrarla.
;
; Por último es recomendable tener a disposición un manual de
; interrupciones y de hard. Para tal fin existe la página de Ralf Brown:
;
; http://www.ctyme.com/rbrown.htm
;
; El libro está formado por nueve ejemplos de los siguientes temas:
;
;
;
;
;
;
;
;
;
;
; Personalmente espero que el libro les sea útil, y que me hagan llegar
; cualquier comentario o duda. A su vez pido disculpas por cualquier
; error.
- ej00.asm tutorial de DOS
- ej01.asm entrar y salir a modo protegido
- ej02.asm utilizando un segmento de datos en modo protegido
- ej03.asm interrupciones en modo protegido
- ej04.asm excepciones en modo protegido
- ej05.asm multitarea en modo protegido
- ej06.asm salto de niveles de privilegio en modo protegido
- ej07.asm modo protegido 32 bits y pila expand down
- ej08.asm paginación en modo protegido
; ej00.asm - programa hola mundo
;
; Protected Mode by Examples – 1era Edición - Octubre 2004
;
; Autor:
; Mariano Cerdeiro
; <
[email protected]>
; http://www.soix.com.ar/links/mpbyexamples.html
;
; compilar: nasm ej00.asm -o ej00.com
;
; El primer ejercicio tiene por finalidad mostrar la estructura básica
; de un programa en nasm y el modo en que es cargado en memoria por el
; DOS. También se explican algunos conceptos básicos, como la
; segmentación en modo real y las diferencias entre un segmento de 16 y
; uno de 32 bits.
;
; En modo real (el modo en que se enciende la CPU y en el que se
; mantiene cuando corre el sistema operativo DOS) se accede a la memoria
; mediante segmentos y desplazamientos. El desplazamiento (u offset) es
; un valor de 16 bits que se suma a la base del segmento para conocer la
; memoria lineal y física (las cuales, en modo real, coinciden).
;
; Siempre que se direcciona memoria, se hace mediante un segmento y un
; offset. Para conocer cuál es la posición física de la memoria se deben
; sumar la base del segmento y el offset. En modo real, la base de un
; segmento es 16 veces su valor.
;
; Por ejemplo: el segmento 0040:0037, al escribirlo de esta forma, se
; hace referencia al segmento:offset (ambos en hexadecimal) que apunta a
; la dirección de memoria 00437h.
;
; Por lo cual, para acceder a cualquier posición de memoria, existen
; 4096 formas distintas de hacerlo ya que, por ejemplo, 4000:FFFF
; será físicamente la misma posición que 4001:FFEF (físicamente ambas
; direcciones serán 4FFFF, o sea, el byte número 327679 de la memoria).
;
;
; El DOS es quien carga los programas .com, que son los únicos que se
; utilizan en este libro. A diferencia de los archivos .exe, que poseen
; un header con información para el sistema, los archivos .com son
; directamente copiados a memoria y ejecutados, pero existen ciertas
; reglas a conocer:
;
;
;
;
;
;
;
;
; EL PSP almacena información de la aplicación (en Internet se puede
; averiguar cómo está conformado). Sin embargo, lo más importante a
; saber es que en el offset 80h se encuentra un byte que indica la
; cantidad de caracteres que contiene la línea de comandos, y a partir
; del offset 81h se encuentra la línea de comandos.
;
; Al cargar el .com se inicializan los registros ax,bx,cx,dx,bp,si,di en
; 0, el sp en FFFCh y cs,ds,es,ss en el segmento de memoria libre, y el
; ip en 100. Por lo que se puede observar que el código y los datos se
; superponen en el mismo segmento y éstos con la PILA. Por eso se debe
- cuando se ejecuta un archivo .com, el mismo se carga en memoria
a partir del primer segmento libre de memoria que tenga
disponible el DOS.
- se le asigna toda la memoria hasta los 640 Kbytes.
- se carga el contenido del del archivo .com a partir del offset
100h, quedando así 256 bytes para el sistema, los cuales se
denominan PSP (Program Segment Prefix).
; tener especial CUIDADO cuando se utiliza mucha pila, ya que una
; excesiva cantidad de pushs podría sobrescribir el código o los datos
; del programa.
;
; Lo primero que se escribe al comenzar un programa es la directiva
; use16 o use32. Ésta indica para qué tipo de segmento debe ser
; compilado el programa (para un segmento de 16 o de 32 bits).
;
use16
;
;
; Segmentos de 16 y de 32 bits.
;
; Que un segmento sea de 16 o de 32 bits, indica qué tipo de registros y
; direccionamiento se utilizan en forma predeterminada, de modo que las
; instrucciones que utilizan registros y direccionamientos
; predeterminados ocupan menos espacio. Veamos un ejemplo:
;
; 89 C8 mov ax,cx
;
; Se puede observar que la instrucción se codifica como 89 C8. Se trata
; de una instrucción que ocupa 2 bytes. Haciendo lo mismo con eax y ecx
; se obtiene:
;
; 66 89 C8 mov eax,ecx
;
; Aquí, al utilizar eax y ecx, se ocupa un byte más, el 66. Éste
funciona
; como prefijo, y su función es indicar al procesador que la siguiente
; instrucción se debe decodificar utilizando el tipo de registros no
; predeterminado. De esto que se deduce correctamente que las
; instrucciones anteriores han sido compiladas para 16 bits. Si, por el
; contrario, se compilan estas dos mismas instrucciones en código 32
; bits, se obtiene:
;
; 89 C8 mov eax,ecx
; 66 89 C8 mov ax,cx
;
; Se puede ver que la instrucción más corta es la de 32 bits. 66h no es
; el único prefijo que existe, también existe el 67h, que cumple una
; función similar, pero no con el tamaño del registro, sino con el tipo
; de direccionamiento (si es de 16 o de 32 bits). También existen otros
; prefijos, pero no están relacionados con el tipo de segmento.
;
; Por lo que una misma instrucción se puede codificar de dos formas
; distintas, según se trate de un segmento de 16 o de uno de 32 bits (se
; le debe indicar al procesador de qué tipo de segmento de código se
; trata). Para tal fin existe un bit en la definición del segmento. Sin
; embargo, en modo real, los segmentos pueden ser únicamente de 16 bits,
; por lo que se dejarán para más adelante los segmentos de 32 bits y se
; utilizarán, hasta el ejemplo 6 inclusive, segmentos de 16 bits.
;
org 100h
;
; Debido a que el compilador desconoce que los archivos .com son
; cargados y ejecutados a partir del offset 100h, se debe indicar el
; offset inicial. De esta forma, al referirse a la cadena mensaje (leer
; líneas más delante), mediante el puntero
Comentarios de: Ejemplos de Modo Protegido - Programación en Assembler (0)
No hay comentarios