| DS:RCodeSeg
;----------------------------------------------------------------------------
VGDTR PDesc <GDTLen-1,> ;GDT伪描述符
VIDTR PDesc <IDTLen-1,> ;IDT伪描述符
NORVIDTR PDesc <> ;用于保存原IDTR值
SPVar DW ? ;用于保存实方式下的SP
SSVar DW ? ;用于保存实方式下的SS
;----------------------------------------------------------------------------
Start PROC
mov ax,RCodeSeg
mov ds,ax
cld
call InitGDT ;初始化全局描述符表GDT
call InitIDT ;初始化中断描述符表IDT
mov ax,V86LDTSeg
mov fs,ax
mov cx,V86LDNum
mov si,OFFSET VLDT
call InitLDT
mov ax,IntFFLDTSeg
mov fs,ax
mov cx,IntFFLDNum
mov si,OFFSET FLDT
call InitLDT
mov SSVar,ss
mov SPVar,sp
lgdt QWORD PTR VGDTR ;装载GDTR并切换到保护方式
sidt QWORD PTR NORVIDTR ;保存IDTR
cli ;关中断
lidt QWORD PTR VIDTR ;装载IDTR
mov eax,cr0
or al,1
mov cr0,eax
JUMP16 <TempCode_Sel>,<OFFSET Virtual>
Real: mov ax,cs
mov ds,ax
lss sp,DWORD PTR SPVar ;又回到实方式
lidt QWORD PTR NORVIDTR
sti
mov ax,4c00h
int 21h
Start ENDP
;----------------------------------------------------------------------------
TSRLine LABEL BYTE
;----------------------------------------------------------------------------
InitGDT PROC
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 WORD PTR [si].BaseL,ax
mov BYTE PTR [si].BaseM,dl
mov BYTE PTR [si].BaseH,dh
add si,SIZE Desc
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
InitGDT ENDP
;----------------------------------------------------------------------------
;入口参数:FS:SI=第一个要初始化的描述符,CX=要初始化的描述符数
;----------------------------------------------------------------------------
InitLDT PROC
mov ax,WORD PTR FS:[si].BaseL
movzx eax,ax
shl eax,4
shld edx,eax,16
mov WORD PTR fs:[si].BaseL,ax
mov BYTE PTR fs:[si].BaseM,dl
mov BYTE PTR fs:[si].BaseH,dh
add si,SIZE Desc
loop InitLDT
ret
InitLDT ENDP
;----------------------------------------------------------------------------
InitIDT PROC
push ds
mov ax,IDTSeg
mov ds,ax
mov cx,256-1
mov si,OFFSET IDT
mov ax,OFFSET TPBegin
IIDT1: cmp cx,256-1-13
jz IIDT2
mov [si],ax
IIDT2: add si,8
add ax,7
loop IIDT1
pop ds
mov bx,16
mov ax,IDTSeg
mul bx
mov WORD PTR VIDTR.Base,ax
mov WORD PTR VIDTR.Base+2,dx
ret
InitIDT ENDP
;----------------------------------------------------------------------------
RCodeSeg ENDS
END Start
用于演示INTFF任务的源程序如下:
;功能:用于演示V86模式下的INTFF任务
;编译:TASM INTFF.ASM
;连接:TLINK INTFF.OBJ
;====================================================================
Text SEGMENT
ASSUME cs:Text,ds:Text
;---------------------------------------
Start PROC
int 0ffh
mov ax上一页 [1] [2] [3] [4] [5] [6] 下一页 |