Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CANT_DESCRIPTORES_GDT EQU 2 ; Cantidad de descriptores en la GDT.
- .386P ;Este programa corre en 80386 o uP posterior.
- ;Se agrega la "P" ya que se van a ejecutar
- ;instrucciones privilegiadas.
- codigo segment use16 ;El segmento es de 16 bits.
- ;Todos los programas DOS en 386 deben tener USE16.
- assume cs:codigo,ds:codigo
- org 100h ;Todo programa .COM debe tener esta directiva ya
- ;que los primeros 256 bytes del segmento estan
- ;reservados para el Program Segment Prefix (PSP).
- comienzo: jmp short inicio ;Saltear la zona de datos.
- imagen_GDTR label fword ;Indica que la imagen del GDTR ocupa 6 bytes.
- ;La directiva LABEL no reserva espacio en memoria.
- limite_GDTR dw CANT_DESCRIPTORES_GDT*8-1
- ;El limite del GDTR es uno menos que la longitud
- ;de la GDT (Tabla de Descriptores Globales).
- base_GDTR dd 0 ;Se llena en tiempo de ejecucion.
- GDT db 8 dup (0) ;El primer descriptor de la GDT nunca se usa.
- dw 0FFFFh ;Byte 0 y 1 - Bits 15-0 del limite del segmento.
- dw 0000h ;Byte 2 y 3 - Bits 15-0 de la direccion base del segmento.
- db 00h ;Byte 4 - Bits 23-16 de la direccion base del segmento.
- db 10010010b ;Byte 5 - Byte de derechos de acceso del segmento.
- db 00001111b ;Byte 6 - Byte miscelaneo.
- db 00h ;Byte 7 - Bits 31-24 de la direccion base del segmento
- inicio:
- ;
- ; Lo primero que hay que hacer es inicializar el valor base de GDTR.
- ; El valor absoluto depende de donde el DOS puso el programa en memoria,
- ; por eso hay que leer el registro de segmento CS para saber cual es el
- ; valor del segmento donde se encuentra la Global Descriptor Table.
- ;
- mov ax,cs ; AX = Segmento de la GDT.
- mov bx,offset GDT ; BX = Offset de la GDT.
- movzx eax,ax ; Extender a 32 bits.
- movzx ebx,bx
- shl eax,4 ; Base GDT = Segmento GDT * 16 + Offset GDT
- add eax,ebx ; EAX = Base de la GDT.
- mov base_GDTR,eax ; Almacenar la base de la GDT.
- cli ; Deshabilitar interrupciones.
- lgdt imagen_GDTR ; Cargar el GDTR con la base y limite de GDT.
- smsw ax ; Leer la Machine Status Word (MSW).
- or al,1 ; Poner a uno el bit Protection Enable (PE).
- lmsw ax ; Almacenar la MSW. En este momento el uP
- ; corre en modo protegido.
- jmp short $+2 ; Vaciar la cola de instrucciones.
- mov ax,8 ; AX = Selector del segmento de datos.
- mov ds,ax ; Cargar el nuevo segmento de datos.
- mov edx,0B8000h ; Direccion inicial donde se van a poner
- ; los datos.
- mov cx,800h/2 ; Cantidad de palabras (words) a poner.
- ciclo_llenado:
- mov word ptr [edx],0c03h ; Dato a poner en memoria.
- add edx,2 ; Apuntar a la siguiente palabra.
- loop ciclo_llenado ; LOOP siempre usa CX como contador.
- mov eax,cr0 ; Obtener el valor del registro de control 0.
- and al,0FEh ; Poner a cero el bit Protection Enable (PE).
- mov cr0,eax ; Cargarlo. En este momento el uP esta en
- ; modo real nuevamente.
- jmp short $+2 ; Vaciar la cola de instrucciones.
- sti ; Volver a habilitar interrupciones.
- mov ax,4C00h ; Funcion de DOS para terminar el programa.
- int 21h
- codigo ends ; Final del unico segmento.
- end comienzo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement