| PARA USE16
DD 0 ;链接字
DD V86Stack0Len ;0级堆栈指针
DW V86Stack0_Sel,0 ;0级堆栈选择子
DD 0 ;1级堆栈指针(实例不使用)
DW 0,0 ;1级堆栈选择子(实例不使用)
DD 0 ;2级堆栈指针(实例不使用)
DW 0,0 ;2级堆栈选择子(实例不使用)
DD 0 ;CR3
DW V86Begin,0 ;EIP
DD IOPL3 OR VMFL ;EFLAGS(IO特权级为3,VM=1)
DD 0 ;EAX
DD 0 ;ECX
DD 0 ;EDX
DD 0 ;EBX
DD V86Stack3Len ;ESP
DD 0 ;EBP
DD 0 ;ESI
DD 0 ;EDI
DW V86CodeSeg,0 ;ES
DW V86CodeSeg,0 ;CS
DW V86Stack3Seg,0 ;SS
DW V86CodeSeg,0 ;DS
DW V86CodeSeg,0 ;FS
DW V86CodeSeg,0 ;GS
DW V86LDT_Sel,0 ;LDTR
DW 0 ;调试陷阱标志
DW $+2 ;指向I/O许可位图
DB 4000h/8 DUP(0) ;I/O许可位图
DB 0ffh ;I/O许可位图结束标志
;----------------------------------------------------------------------------
V86TSSLen = $
V86TSSSeg ENDS
;============================================================================
;V86任务的LDT段
V86LDTSeg SEGMENT PARA USE16
VLDT LABEL BYTE
;----------------------------------------------------------------------------
;V86任务线性地址空间中最低端1M字节段的描述符及描述符
VAllMem Desc <0ffffh,,,ATDWA,0fh,>
VAllMem_Sel = VAllMem-VLDT+TIL
;V86任务0级堆栈段描述符及选择子
V86Stack0 Desc <V86Stack0Len-1,V86Stack0Seg,,ATDWA,,>
V86Stack0_Sel = V86Stack0-VLDT+TIL
;V86任务数据段描述符及选择子
V86Data Desc <V86DataLen-1,V86DataSeg,,ATDR,,>
V86Data_Sel = V86Data-VLDT+TIL
;V86任务中断/异常处理程序代码段描述符及选择子
TPCode Desc <TPCodeLen-1,TPCodeSeg,,ATCE,,>
TPCode_Sel = TPCode-VLDT+TIL
;V86任务通用保护异常处理程序代码段描述符及选择子
GPCode Desc <GPCodeLen-1,GPCodeSeg,,ATCE,,>
GPCode_Sel = GPCode-VLDT+TIL
;----------------------------------------------------------------------------
V86LDNum = ($-VLDT)/(SIZE Desc)
V86LDTLen = $
V86LDTSeg ENDS
;============================================================================
;V86任务的0级堆栈
V86Stack0Seg SEGMENT PARA USE16
V86Stack0Len = 512
DB V86Stack0Len DUP(0)
V86Stack0Seg ENDS
;============================================================================
;V86任务的3级堆栈
V86Stack3Seg SEGMENT PARA USE16
V86Stack3Len = 1024
DB V86Stack3Len DUP(0)
V86Stack3Seg ENDS
;============================================================================
;V86任务数据段
V86DataSeg SEGMENT PARA USE16
GPErrMess DB '......General Protection Error......'
GPErrMessLen = $-GPErrMess
V86DataLen = $
V86DataSeg ENDS
;============================================================================
;定义部分代表堆栈单元的符号
Perr EQU <WORD PTR [BP+0]>
Pip EQU <WORD PTR [bp+4]>
Pcs EQU <WORD PTR [bp+8]>
Pflag EQU <WORD PTR [bp+12]>
Psp EQU <WORD PTR [bp+16]>
Pss EQU <WORD PTR [bp+20]>
Pes EQU <WORD PTR [bp+24]>
Pds EQU <WORD PTR [bp+28]>
Pfs EQU <WORD PTR [bp+32]>
Pgs EQU <WORD PTR [bp+36]>
;============================================================================
;V86任务下的中断/异常处理程序代码段
TPCodeSeg SEGMENT PARA USE16
ASSUME CS:TPCodeSeg
;----------------------------------------------------------------------------
TPBegin PROC FAR
Count = 0
REPT 256 ;对应256个入口
IF Count EQ 21h
Ent21H LABEL BYTE ;在第21H项处定义标号Ent21H
ENDIF
push bp
mov bp,Count ;置中断向量号到BP
jmp Process ;都转统一的处理程序
Count = Count+1
ENDM
Process: push bp ;保存BP
mov bp,sp 上一页 [1] [2] [3] [4] [5] [6] 下一页 |