;用tasm3.0汇编,masm汇编出错
;tlink /32 T10-4.obj
INCLUDE 386SCD.asm
.386P
GDTSEG SEGMENT PARA USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
NORMAL DESCRIPTOR <0FFFFH,0,0,92H,>
NORMAL_SEL = NORMAL-GDT
EFFGDT LABEL BYTE
DEMOTSS DESCRIPTOR <DEMOTSSLEN-1,DEMOTSSSEG,0,89H,>
DEMOTSS_SEL = DEMOTSS-GDT
DEMOLDTD DESCRIPTOR <DEMOLDTLEN-1,DEMOLDTSEG,,82H,>
DEMOLDT_SEL = DEMOLDTD-GDT
TEMPCODE DESCRIPTOR <0ffffh,TEMPCODESEG,0,98H,>
TEMPCODE_SEL = TEMPCODE-GDT
VIDEOBUFFER DESCRIPTOR <0FFFFH,0,0,0F00H+92H+DPL3,0>
VIDEO_SEL = VIDEOBUFFER-GDT
GDNUM = ($-EFFGDT)/(SIZE DESCRIPTOR)
GDTLEN = $-GDT
GDTSEG ENDS
DemoLDTSEG SEGMENT PARA USE16
DEMOLDT LABEL BYTE
DEMOSTACK0 DESCRIPTOR <DEMOSTACK0LEN-1,DEMOSTACK0SEG,,92H+4000H,>
DEMOSTACK0_SEL = (DEMOSTACK0-DEMOLDT)+TIL
DEMOSTACK1 DESCRIPTOR <DEMOSTACK1LEN-1,DEMOSTACK1SEG,,92H+4000H+DPL1,>
DEMOSTACK1_SEL = (DEMOSTACK1-DEMOLDT)+TIL+RPL1
DEMOSTACK3 DESCRIPTOR <DEMOSTACK3LEN-1,DEMOSTACK3SEG,,92H+DPL3,>
DEMOSTACK3_SEL = (DEMOSTACK3-DEMOLDT)+TIL+RPL3
DEMOCODE DESCRIPTOR <DEMOCODELEN-1,DEMOCODESEG,,4098H+DPL3,>
DEMOCODE_SEL = DEMOCODE-DEMOLDT+TIL+RPL3
T32CODE DESCRIPTOR <T32CODELEN-1,T32CODESEG,,98H+4000H,>
T32CODE_SEL = T32CODE-DEMOLDT+TIL
ECHOSUBR DESCRIPTOR <ECHOSUBRLEN-1,ECHOSUBRSEG,,409AH+DPL1,>
ECHO_SEL1 = ECHOSUBR-DEMOLDT+TIL+RPL1
ECHO_SEL3 = ECHOSUBR-DEMOLDT+TIL+RPL3
DEMOLDNUM = ($-DEMOLDT)/(SIZE DESCRIPTOR)
TOT32GATEA GATE <T32BEGIN,T32CODE_SEL,0,8CH,0>
TOT32A_SEL = TOT32GATEA-DEMOLDT+TIL
TOT32GATEB GATE <T32END,T32CODE_SEL,0,8CH+DPL3,0>
TOT32B_SEL = (TOT32GATEB-DEMOLDT)+TIL
TOECHOGATE GATE <ECHOSUB,ECHO_SEL3,0,8CH+DPL3,0>
TOECHO_SEL = TOECHOGATE-DEMOLDT+TIL
DEMOLDTLEN = $-DEMOLDT
DemoLDTSEG ENDS
;----------------------------
DemoTSSSEG SEGMENT PARA USE16
DD 0
DW DemoStack0LEN,0
DW DemoStack0_SEL,0
DW DemoStack1LEN,0
DW DemoStack1_SEL,0
DD ?
DW ?,0
DD 0
DD ?
DD ?
DD ?
DD ?
DD ?
DD ?
DD ?
DD ?
DD ?
DD ?
DW ?,0
DW ?,0
DW ?,0
DW ?,0
DW ?,0
DW ?,0
DW DemoLDT_SEL,0
DW 0
DW $+2
DB 0FFH
DemoTSSLEN = $
DemoTSSSEG ENDS
;------------------------------
DemoStack0SEG SEGMENT PARA USE32
DemoStack0LEN = 512
DB DemoStack0LEN DUP(0)
DemoStack0SEG ENDS
DemoStack1SEG SEGMENT PARA USE32
DemoStack1LEN = 512
DB DemoStack1LEN DUP(0)
DemoStack1SEG ENDS
DemoStack3SEG SEGMENT PARA USE16
DemoStack3LEN = 512
DB DemoStack3LEN DUP(0)
DemoStack3SEG ENDS
;-----------------------------
EchoSUBRSEG SEGMENT PARA USE32
MESSAGE DB 'CPL = ',0
ASSUME CS:EchoSUBRSEG
EchoSUB PROC FAR
CLD
PUSH EBP
MOV EBP,ESP
MOV AX,Echo_SEL1
MOV DS,AX
MOV AX,Video_SEL
MOV ES,AX
MOV EDI,0B8000H
MOV ESI,OFFSET MESSAGE
MOV AH,17H
EchoSUB1:
LODSB
OR AL,AL
JZ EchoSUB2
STOSW
JMP EchoSUB1
EchoSUB2:
MOV EAX,[EBP+8]
AND AL,3
ADD AL,'0'
MOV AH,17H
STOSW
POP EBP
RETF
EchoSUB ENDP
EchoSUBRLEN = $
EchoSUBRSEG ENDS
;-----------------------------
DemoCodeSEG SEGMENT PARA USE32
ASSUME CS:DemoCodeSEG
DemoBegin:
CALL32 ToEcho_SEL,0
CALL32 ToT32B_SEL,0
DemoCodeLEN = $
DemoCodeSEG ENDS
;-----------------------------
T32CODESEG SEGMENT PARA USE32
ASSUME CS:T32CODESEG
T32BEGIN:
MOV AX,DemoStack0_SEL
MOV SS,AX
MOV ESP,DemoStack0LEN
PUSH DWORD PTR DemoStack3_SEL
PUSH DWORD PTR DemoStack3LEN
PUSH DWORD PTR DemoCode_SEL
PUSH OFFSET DemoBegin
RETF
T32End:
JUMP32 TempCode_SEL,<OFFSET ToReal>
T32CodeLEN = $
T32CODESEG ENDS
;-----------------------------
TempCodeSEG SEGMENT PARA USE16
ASSUME CS:TempCodeSEG
VIRTUAL:
MOV AX,DemoTSS_SEL
LTR AX
MOV BX,DemoLDT_SEL
LLDT BX
JUMP16 ToT32A_SEL,0
TOREAL:
MOV AX,NORMAL_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV EAX,CR0
AND AX,0FFFEH
MOV CR0,EAX
JUMP16 <SEG REAL>,<OFFSET REAL>
TempCodeLEN = $
TempCodeSEG ENDS
;---------------------------
RDataSeg SEGMENT PARA USE16
VGDTR PDESC <GDTLEN-1,>
SPVAR DW ?
SSVAR DW ?
RDataSeg ENDS
;---------------------------
RCodeSEG SEGMENT PARA USE16
ASSUME CS:RCodeSEG,DS:RDataSeg
START:
MOV AX,RDataSeg
MOV DS,AX
CLD
CALL INIT_GDT
MOV AX,DemoLDTSEG
MOV FS,AX
MOV SI,OFFSET DemoLDT
MOV CX,DemoLDNUM
CALL INIT_LDT
MOV SSVAR,SS
MOV SPVAR,SP
LGDT QWORD PTR VGDTR
CLI
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 TempCode_SEL,<OFFSET Virtual>
REAL:
MOV AX,RDataSeg
MOV DS,AX
LSS SP,DWORD PTR SPVAR
STI
MOV AH,4CH
INT 21H
INIT_GDT PROC NEAR
PUSH DS
MOV AX,GDTSEG
MOV DS,AX
MOV CX,GDNUM
MOV SI,OFFSET EFFGDT
INITG:MOV AX,[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV [SI].BASEL,AX
MOV [SI].BASEM,DL
MOV [SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR
LOOP INITG
POP DS
MOV BX,16
MOV AX,GDTSEG
MUL BX
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
RET
INIT_GDT ENDP
INIT_LDT PROC
ILDT: MOV AX,FS:[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV FS:[SI].BASEL,AX
MOV FS:[SI].BASEM,DL
MOV FS:[SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR
LOOP ILDT
RET
INIT_LDT ENDP
RCodeSEG ENDS
END START