Advertisement
goldfenrir

Untitled

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