导读:
DESCRIPTOR ENDS
伪描述符结构类型定义
PDESC STRUCT
LIMIT DW 0
BASE DD 0
PDESC ENDS
DSEG SEGMENT USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
CODE DESCRIPTOR <0FFFFH,0,0,98H,0H>
CODE_SEL = CODE - GDT
LDT DESCRIPTOR
LDT_SEL = LDT - GDT
VIDEO1 DESCRIPTOR <0FFFFH,8000H,0BH,92H,0>
VIDEO_SEL1 = VIDEO1 - GDT
GDTLEN = $ - GDT
GDTR PDESC
DSEG ENDS
LDTSEG SEGMENT USE16
_LDT LABEL BYTE
VIDEO DESCRIPTOR <0FFFFH,8000H,0BH,92H,0>
VIDEO_SEL = VIDEO - _LDT + 04H
LDTLEN = $ - _LDT
LDTSEG ENDS
CSEG SEGMENT USE16
ASSUME CS:CSEG,DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
;设置GDTR
MOV BX,16
MUL BX
ADD AX,OFFSET GDT
ADC DX,0
MOV WORD PTR GDTR.BASE,AX
MOV WORD PTR GDTR.BASE+2,DX
;设置代码段
MOV AX,C32SEG
MUL BX
MOV CODE.BASEL,AX
MOV CODE.BASEM,DL
MOV CODE.BASEH,DH
LGDT FWORD PTR GDTR
CLI
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP ,0
C16:
MOV AX,4C00H
INT 21H
CSEG ENDS
C32SEG SEGMENT USE16 <这里找成use32就行不了>
MOV AX,VIDEO_SEL1
MOV ES,AX
MOV AX,8A41H
MOV WORD PTR ES:[160*5],AX
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP
C16>, C32SEG ENDS
END START
[本帖最后由 xjtdy888 于 2008-3-1 13:43 编辑 ]
本文转自
http://www.oldlinux.org/oldlinux/viewthread.php?tid=10905&extra=page%3D2
DESCRIPTOR ENDS
伪描述符结构类型定义
PDESC STRUCT
LIMIT DW 0
BASE DD 0
PDESC ENDS
DSEG SEGMENT USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
CODE DESCRIPTOR <0FFFFH,0,0,98H,0H>
CODE_SEL = CODE - GDT
LDT DESCRIPTOR
LDT_SEL = LDT - GDT
VIDEO1 DESCRIPTOR <0FFFFH,8000H,0BH,92H,0>
VIDEO_SEL1 = VIDEO1 - GDT
GDTLEN = $ - GDT
GDTR PDESC
DSEG ENDS
LDTSEG SEGMENT USE16
_LDT LABEL BYTE
VIDEO DESCRIPTOR <0FFFFH,8000H,0BH,92H,0>
VIDEO_SEL = VIDEO - _LDT + 04H
LDTLEN = $ - _LDT
LDTSEG ENDS
CSEG SEGMENT USE16
ASSUME CS:CSEG,DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
;设置GDTR
MOV BX,16
MUL BX
ADD AX,OFFSET GDT
ADC DX,0
MOV WORD PTR GDTR.BASE,AX
MOV WORD PTR GDTR.BASE+2,DX
;设置代码段
MOV AX,C32SEG
MUL BX
MOV CODE.BASEL,AX
MOV CODE.BASEM,DL
MOV CODE.BASEH,DH
LGDT FWORD PTR GDTR
CLI
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP ,0
C16:
MOV AX,4C00H
INT 21H
CSEG ENDS
C32SEG SEGMENT USE16 <这里找成use32就行不了>
MOV AX,VIDEO_SEL1
MOV ES,AX
MOV AX,8A41H
MOV WORD PTR ES:[160*5],AX
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP
C16>, C32SEG ENDS
END START
[本帖最后由 xjtdy888 于 2008-3-1 13:43 编辑 ]
本文转自
http://www.oldlinux.org/oldlinux/viewthread.php?tid=10905&extra=page%3D2