80x86(杨季文)一书,实例1。
sum_1 2002-11-06 12:17:36
.386P
INCLUDE 386SCD.ASM
ECHOCH MACRO ascii
MOV AH,2
MOV DL,ascii
INT 21H
ENDM
DSEG SEGMENT USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR<>
CODE DESCRIPTOR<0FFFFH,,,ATCE,>
CODE_SEL=CODE-GDT
;DATAS DESCRIPTOR<0FFFFH,0H,11H,ATDW,0>
;DATAS_SEL=DATAS-GDT
;DATAD DESCRIPTOR<0FFFFH,,,ATDW,>
;DATAD_SEL=DATAD-GDT
GDTLEN=$-GDT
VGDTR PDESC<GDTLEN-1,>
;BUFFERLEN=256
;BUFFER DB BUFFERLEN DUP(0)
DSEG ENDS
CSEG SEGMENT USE16
ASSUME CS:CSEG,DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV BX,16
MUL BX
ADD AX,OFFSET GDT
ADC DX,0
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
MOV AX,CS
MUL BX
MOV CODE.BASEL,AX
MOV CODE.BASEM,DL
MOV CODE.BASEH,DH
;MOV AX,DS
;MUL BX
;ADD AX,OFFSET BUFFER
;ADC DX,0
;MOV DATAD.BASEL,AX
;MOV DATAD.BASEM,DL
;MOV DATAD.BASEH,DH
LGDT VGDTR
CLI
CALL ENABLEA20
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 <CODE_SEL>,<OFFSET VIRTUAL>
VIRTUAL:
;MOV AX,DATAS_SEL
;MOV DS,AX
;MOV AX,DATAD_SEL
;MOV ES,AX
;CLD
;XOR SI,SI
;XOR DI,DI
;MOV CX,BUFFERLEN/4
;REPZ MOVSD
MOV EAX,CR0
MOV EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP16<SEG REAL>,<OFFSET REAL>
REAL:
CALL DISABLEA20
STI
;MOV AX,DSEG
;MOV DS,AX
MOV AH,4C
INT 21H
ENABLEA20 PROC
PUSH AX
IN AL,92H
OR AL,2
OUT 92H,AL
POP AX
RET
ENABLEA20 ENDP
DISABLEA20 PROC
PUSH AX
IN AL,92H
AND AL,0FDH
OUT 92H,AL
POP AX
RET
DISABLEA20 ENDP
TOASCII PROC
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET
TOASCII ENDP
CSEG ENDS
END START
功能是从实模式进入保护模式,什么也不做再回到实模式,可是每次执行到MOV CR0,EAX时机器总是
重启(CR0:PG=0,PE=1,ET=1)GDT的装载经调试是正确的,不知是哪里不对。
;文件名:386SCD.ASM
;内 容:符号常量等的定义(用于保护模式)
;详细注释见80x86汇编(杨季文)一书,p403页
;..........................
;存储段和系统段描述符
DESCRIPTOR STRUC
LIMITL DW 0
BASEL DW 0
BASEM DB 0
ATTRIBUTES DW 0
BASEH DB 0
DESCRIPTOR ENDS
;.........................
;门描述符
GATE STRUC
OFFSETL DW 0
SELECTOR DW 0
DCOUNT DB 0
GTYPE DB 0
OFFSETH DW 0
GATE ENDS
;.........................
;伪描述符
PDESC STRUC
LIMIT DW 0
BASE DD 0
PDESC ENDS
;.........................
;TSS任务状态段内容
TASKSS STRUC
TRLINK DW ?,0
TRESP0 DD ?
TRSS0 DW ?,0
TRESP1 DD ?
TRSS1 DW ?,0
TRESP2 DD ?
TRSS2 DW ?,0
TRCR3 DD ?
TREIP DD ?
TREFLAG DW ?,?
TREAX DD ?
TRECX DD ?
TREDX DD ?
TREBX DD ?
TRESP DD ?
TREBP DD ?
TRESI DD ?
TREDI DD ?
TRES DW ?,0
TRCS DW ?,0
TRSS DW ?,0
TRDS DW ?,0
TRFS DW ?,0
TRGS DW ?,0
TRLDT DW ?,0
TRFLAG DW 0
TRIOMAP DW $+2
TASKSS ENDS
;..........................
;存储段描述符类型值说明
ATDR =90H
ATDW =92H
ATDWA =93H
ATCE =98H
ATCER =9AH
ATCCO =9CH
ATCCOR =9EH
;系统段描述符和门描述符类型值说明
ATLDT =82H
ATTASKGAT =85H
AT386TSS =89H
AT386CGAT =8CH
AT386IGAT =8EH
AT386TGAT =8FH
;DPL和RPL值说明
;..........................
DPL1 =20H
DPL2 =40H
DPL3 =60H
RPL1 =01H
RPL2 =02H
RPL3 =03H
IOPL1 =1000H
IOPL2 =2000H
IOPL3 =3000H
;.............................
;其它常量说明
D32 =4000H
TIL =04H
VMFL =0002H
IFL =0200H
;.............................
;段间转移及段间调用宏
JUMP32 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW 0
DW selector
ENDM
CALL32 MACRO selector,offsetv
DB 09AH
DW offsetv
DW 0
DW selector
ENDM
JUMP16 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW selector
ENDM
CALL16 MACRO selector,offsetv
DB 9AH
DW offsetv
DW selector
ENDM
;................................