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