News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

What effect is LDT?

Started by leetow2003, January 10, 2011, 02:56:34 AM

Previous topic - Next topic

leetow2003

My codes run well,but I find if I put away two instructions in CODEKSEG segment:
        MOV     AX,LDT_SEL
        LLDT    AX   
My codes run well too,I want to know why?What effect is LDT?
Look:
;
JUMP16  MACRO   selector, offsetv
        DB      0EAH           
        DW      offsetv         
        DW      selector       
        ENDM
;
DESCRIPTOR      STRUC
        LIMITL          DW      0       
        BASEL           DW      0       
        BASEM           DB      0       
        ATTRIBUTES      DW      0     
        BASEH           DB      0       
DESCRIPTOR      ENDS

;--------------------------------------------------------
PDESC   STRUC
        LIMIT   DW      0       
        BASE    DD      0       
PDESC ends

         .386P
;=========GDT
GDTSEG  SEGMENT PARA    USE16 
GDT             LABEL   BYTE
DUMMY           DESCRIPTOR      <>                   
;global segment
CODEK           DESCRIPTOR      <0FFFFH,,,98H,>       
CODEK_SEL       =       CODEK - GDT
;local segment
LDTABLE         DESCRIPTOR      <0FFFFH,,,82H,>     
LDT_SEL         =       LDTABLE - GDT
GDTLEN          =       $ - GDT   
GDTSEG  ENDS
;============Define PDESC
RDATASEG        SEGMENT PARA    USE16
VGDTR           PDESC   <GDTLEN-1,>     
RDATASEG        ENDS
;=============LDT
LDTSEG  SEGMENT PARA    USE16 
LDT             LABEL   BYTE
CODEL           DESCRIPTOR <0FFFFH,,,98H,>       
CODEL_SEL       =       (CODEL-LDT) + 04H   
LDTLEN          =       $ - LDT                                       
LDTSEG  ENDS
; Local code segment
CODELSEG        SEGMENT PARA    USE16   
                ASSUME  CS:CODELSEG
VIRTUAL2:
        ;
        JUMP16  CODEK_SEL,VIRTUAL3     
CODELSEG        ENDS
;Global code segment
CODEKSEG        SEGMENT PARA    USE16   
                ASSUME  CS:CODEKSEG
VIRTUAL1:
        MOV     AX,LDT_SEL
        LLDT    AX                     
        ;
        JUMP16  CODEL_SEL,VIRTUAL2     
VIRTUAL3:
        ;
        MOV     EAX,CR0
        AND     EAX,0FFFFFFFEH
        MOV     CR0,EAX                 
        JUMP16  <SEG REAL>,<OFFSET REAL>
CODEKSEG        ENDS
;======Main code segment
RECODESEG       SEGMENT PARA    USE16
                ASSUME  CS:RECODESEG
START: 
        ASSUME  DS:GDTSEG 
        MOV     AX,GDTSEG
        MOV     DS,AX
        ;
        MOV     BX,16
        MOV     AX,CODEKSEG 
        MUL     BX
        MOV     CODEK.BASEL,AX
        MOV     CODEK.BASEM,DL
        MOV     CODEK.BASEH,DH
   ;
        MOV     AX,LDTSEG 
        MUL     BX
        MOV     LDTABLE.BASEL,AX
        MOV     LDTABLE.BASEM,DL
        MOV     LDTABLE.BASEH,DH
        ;T
   ASSUME  DS:LDTSEG
        MOV     AX,LDTSEG
        MOV     DS,AX
        MOV     BX,16
        MOV     AX,CODELSEG   
        MUL     BX
        MOV     CODEL.BASEL,AX
        MOV     CODEL.BASEM,DL
        MOV     CODEL.BASEH,DH
   ;
   ASSUME  DS:RDATASEG
        MOV     AX,RDATASEG
        MOV     DS,AX
        MOV     AX,GDTSEG
        MUL     BX
        MOV     WORD PTR VGDTR.BASE,AX
        MOV     WORD PTR VGDTR.BASE+2,DX
        LGDT    FWORD PTR VGDTR
        CLI
        ;
   call ea20           
        MOV     EAX,CR0
        OR      EAX,1
        MOV     CR0,EAX
        JUMP16    <CODEK_SEL>,<OFFSET VIRTUAL1>


        REAL:
   call da20             
   sti                   

   MOV     AX,4C00H
        INT     21H
;
ea20        proc
            push  ax
     in    al,92h
     or    al,2
     out   92h,al
     pop   ax
     ret
ea20        endp
;
;
da20        proc
            push  ax
     in    al,92h
     and   al,0fdh     ;0fdh=not 20h
     out   92h,al
     pop   ax
     ret
da20        endp
;
     
RECODESEG ENDS
          END START