📄 dtos.asm
字号:
;名称:386SCD.INC
;功能:符号常量等的定义
;----------------------------------------------------------------------------
;IFNDEF __386SCD_INC
;__386SCD_INC EQU 1
;----------------------------------------------------------------------------
.386P
;----------------------------------------------------------------------------
;打开A20地址线
;----------------------------------------------------------------------------
EnableA20 MACRO
push ax
in al,92h
or al,00000010b
out 92h,al
pop ax
ENDM
;----------------------------------------------------------------------------
;关闭A20地址线
;----------------------------------------------------------------------------
DisableA20 MACRO
push ax
in al,92h
and al,11111101b
out 92h,al
pop ax
ENDM
;----------------------------------------------------------------------------
;16位偏移的段间直接转移指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
JUMP16 MACRO Selector,Offset
DB 0eah ;操作码
DW Offset ;16位偏移量
DW Selector ;段值或段选择子
ENDM
;---,------------------------------------------------------------------------
;32位偏移的段间直接转移指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
COMMENT <JUMP32>
JUMP32 MACRO Selector,Offset
DB 0eah ;操作码
DD OFFSET
DW Selector ;段值或段选择子
ENDM
<JUMP32>
;---------------------,---------------------------
JUMP32 MACRO Selector,Offset
DB 0eah ;操作码
DW OFFSET
DW 0
DW Selector ;段值或段选择子
ENDM
;----------------------------------------------------------------------------
;16位偏移的段间调用指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
CALL16 MACRO Selector,Offset
DB 9ah ;操作码
DW Offset ;16位偏移量
DW Selector ;段值或段选择子
ENDM
;----------------------------------------------------------------------------
;32位偏移的段间调用指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
COMMENT <CALL32>
CALL32 MACRO Selector,Offset
DB 9ah ;操作码
DD Offset
DW Selector ;段值或段选择子
ENDM
<CALL32>
;-------------------------------------------------
CALL32 MACRO Selector,Offset
DB 9ah ;操作码
DW Offset
DW 0
DW Selector ;段值或段选择子
ENDM
;----------------------------------------------------------------------------
;存储段描述符结构类型定义
;-----------------,----------------------------------------------------------
Desc STRUC
LimitL DW 0 ;段界限(BIT0-15)
BaseL DW 0 ;段基地址(BIT0-15)
BaseM DB 0 ;段基地址(BIT16-23)
Attributes DB 0 ;段属性
LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
BaseH DB 0 ;段基地址(BIT24-31)
Desc ENDS
;----------------------------,-----------------------------------------------
;门描述符结构类型定义
;----------------------------------------------------------------------------
Gate STRUC
OffsetL DW 0 ;32位偏移的低16位
Selector DW 0 ;选择子
DCount DB 0 ;双字计数
GType DB 0 ;类型
OffsetH DW 0 ;32位偏移的高16位
Gate ENDS
;----------------------------------------------------------------------------
;伪描述符结构类型定义(用于装入全局或中断描述符表寄存器)
;----------------------------------------------------------------------------
PDesc STRUC
Limit DW 0 ;16位界限
Base DD 0 ;32位基地址
PDesc ENDS
;----------------------------------------------------------------------------
;任务状态段结构类型定义
;----------------------------------------------------------------------------
TSS STRUC
TRLink DW 0 ;链接字段
DW 0 ;不使用,置为0
TRESP0 DD 0 ;0级堆栈指针
TRSS0 DW 0 ;0级堆栈段寄存器
DW 0 ;不使用,置为0
TRESP1 DD 0 ;1级堆栈指针
TRSS1 DW 0 ;1级堆栈段寄存器
DW 0 ;不使用,置为0
TRESP2 DD 0 ;2级堆栈指针
TRSS2 DW 0 ;2级堆栈段寄存器
DW 0 ;不使用,置为0
TRCR3 DD 0 ;CR3
TREIP DD 0 ;EIP
TREFlag DD 0 ;EFLAGS
TREAX DD 0 ;EAX
TRECX DD 0 ;ECX
TRDDX DD 0 ;EDX
TREBX DD 0 ;EBX
TRESP DD 0 ;ESP
TREBP DD 0 ;EBP
TRESI DD 0 ;ESI
TREDI DD 0 ;EDI
TRES DW 0 ;ES
DW 0 ;不使用,置为0
TRCS DW 0 ;CS
DW 0 ;不使用,置为0
TRSS DW 0 ;SS
DW 0 ;不使用,置为0
TRDS DW 0 ;DS
DW 0 ;不使用,置为0
TRFS DW 0 ;FS
DW 0 ;不使用,置为0
TRGS DW 0 ;GS
DW 0 ;不使用,置为0
TRLDTR DW 0 ;LDTR
DW 0 ;不使用,置为0
TRTrip DW 0 ;调试陷阱标志(只用位0)
TRIOMap DW $+2 ;指向I/O许可位图区的段内偏移
TSS ENDS
;----------------------------------------------------------------------------
;存储段描述符类型值说明
;----------------------------------------------------------------------------
ATDR EQU 90h ;存在的只读数据段类型值
ATDW EQU 92h ;存在的可读写数据段属性值
ATDWA EQU 93h ;存在的已访问可读写数据段类型值
ATCE EQU 98h ;存在的只执行代码段属性值
ATCER EQU 9ah ;存在的可执行可读代码段属性值
ATCCO EQU 9ch ;存在的只执行一致代码段属性值
ATCCOR EQU 9eh ;存在的可执行可读一致代码段属性值
;----------------------------------------------------------------------------
;系统段描述符类型值说明
;----------------------------------------------------------------------------
ATLDT EQU 82h ;局部描述符表段类型值
ATTaskGate EQU 85h ;任务门类型值
AT386TSS EQU 89h ;可用386任务状态段类型值
AT386CGate EQU 8ch ;386调用门类型值
AT386IGate EQU 8eh ;386中断门类型值
AT386TGate EQU 8fh ;386陷阱门类型值
;--------------------------------------------------------,-------------------
;DPL值说明
;----------------------------------------------------------------------------
DPL0 EQU 00h ;DPL=0
DPL1 EQU 20h ;DPL=1
DPL2 EQU 40h ;DPL=2
DPL3 EQU 60h ;DPL=3
;----------------------------------------------------------------------------
;RPL值说明
;-------------------------------------------------------------------,--------
RPL0 EQU 00h ;RPL=0
RPL1 EQU 01h ;RPL=1
RPL2 EQU 02h ;RPL=2
RPL3 EQU 03h ;RPL=3
;----,-----------------------------------------------------------------------
;IOPL值说明
;----------------------------------------------------------------------------
IOPL0 EQU 0000h ;IOPL=0
IOPL1 EQU 1000h ;IOPL=1
IOPL2 EQU 2000h ;IOPL=2
IOPL3 EQU 3000h ;IOPL=3
;----------------------------------------------------------------------------
;其它常量值说明
;----------------------------------------------------------------------------
D32 EQU 40h ;32位代码段标志
GL EQU 80h ;段界限以4K为单位标志
TIL EQU 04h ;TI=1(局部描述符表标志)
VMFL EQU 00020000h ;VMF=1
VMFLW EQU 0002h
IFL EQU 00000200h ;IF=1
RFL EQU 00010000h ;RF=1(重启动标志,为1表示忽略调试故障)
RFLW EQU 0001h
NTL EQU 00004000h ;NT=1
;----------------------------------------------------------------------------
;分页机制使用的常量说明
;----------------------------------------------------------------------------
PL EQU 1 ;页存在属性位
RWR EQU 0 ;R/W属性位值,读/执行
RWW EQU 2 ;R/W属性位值,读/写/执行
USS EQU 0 ;U/S属性位值,系统级
USU EQU 4 ;U/S属性位值,用户级
;----------------------------------------------------------------------------
;ENDIF
;名称:ASM7.ASM
;功能:模拟异常和演示异常处理
;编译:TASM ASM7.ASM
;连接:TLINK ASM7.OBJ
;----------------------------------------------------------------------------
;INCLUDE 386SCD.INC
;部分常量定义
;----------------------------------------------------------------------------
EOICOM = 20h ;外部中断处理结束命令
ICREGP = 20h ;中断控制寄存器端口地址
IMREGP = 21h ;中断屏蔽寄存器端口地址
;----------------------------------------------------------------------------
GDTSeg SEGMENT PARA USE16 ;全局描述符表数据段(16位)
;----------------------------------------------------------------------------
;全局描述符表GDT
GDT LABEL BYTE
;空描述符
DUMMY Desc <>
;规范段描述符及选择子
Normal Desc <0ffffh,,,ATDW,,>
Normal_Sel = Normal-GDT
;视频缓冲区段描述符(DPL=3)及选择子
VideoBuf Desc <0ffffh,8000h,0bh,ATDW,,>
VideoBuf_Sel = VideoBuf-GDT
;----------------------------------------------------------------------------
EFFGDT LABEL BYTE
;临时代码段描述符及选择子
TempCode Desc <0ffffh,TempCodeSeg,,ATCE,,>
TempCode_Sel = TempCode-GDT
;演示代码段描述符及选择子
DemoCode Desc <DemoCodeLen-1,DemoCodeSeg,,ATCE,,>
DemoCode_Sel = DemoCode-GDT
;演示任务局部描述符表段描述符及选择子
DemoLDT Desc <DemoLDTLen-1,DemoLDTSeg,,ATLDT,,>
DemoLDT_Sel = DemoLDT-GDT
;演示任务TSS段描述符及选择子
DemoTSS Desc <DemoTSSLen-1,DemoTSSSeg,,AT386TSS,,>
DemoTSS_Sel = DemoTSS-GDT
;缓冲数据段描述符及选择子
XBuffer Desc <BufferLen-1,BufferSeg,,ATDW,,>
XBuffer_Sel = XBuffer-GDT
;读键盘任务局部描述符表段描述符及选择子
GKeyLDT Desc <GKeyLDTLen-1,GKeyLDTSeg,,ATLDT,,>
GKeyLDT_Sel = GKeyLDT-GDT
;读键盘任务TSS段描述符及选择子
GKeyTSS Desc <GKeyTSSLen-1,GKeyTSSSeg,,AT386TSS,,>
GKeyTSS_Sel = GKeyTSS-GDT
;读键盘任务局部描述符表段描述符及选择子
KeyLDT Desc <KeyLDTLen-1,KeyLDTSeg,,ATLDT,,>
KeyLDT_Sel = KeyLDT-GDT
;读键盘任务TSS段描述符及选择子
KeyTSS Desc <KeyTSSLen-1,KeyTSSSeg,,AT386TSS,,>
KeyTSS_Sel = KeyTSS-GDT
DispLDT Desc <DispLDTLen-1,DispLDTSeg,,ATLDT,,>
DispLDT_Sel = DispLDT-GDT
DispTSS Desc <DispTSSLen-1,DispTSSSeg,,AT386TSS,,>
DispTSS_Sel = DispTSS-GDT
LedLDT Desc <LedLDTLen-1,LedLDTSeg,,ATLDT,,>
LedLDT_Sel = LedLDT-GDT
LedTSS Desc <LedTSSLen-1,LedTSSSeg,,AT386TSS,,>
LedTSS_Sel = LedTSS-GDT
;显示陷阱处理程序代码段描述符及选择子
EchoCode Desc <EchoCodeLen-1,EchoCodeSeg,,ATCE,,>
EchoCode_Sel = EchoCode-GDT
;0feh号中断处理程序(显示程序)数据段描述符
EchoData Desc <EchoDataLen-1,EchoDataSeg,,ATDW,,>
EchoData_Sel = EchoData-GDT
;8号中断处理程序代码段描述符
TICode Desc <TICodeLen-1,TICodeSeg,,ATCE,,>
;8号中断处理程序数据段描述符
TIData Desc <TIDataLen-1,TIDataSeg,,ATDW,,>
TICode_Sel = TICode-GDT ;8号中断程序代码段选择子
TIData_Sel = TIData-GDT ;8号中断程序数据段选择子
;其它中断或异常处理程序代码段描述符及选择子
Other Desc <OtherCodeLen-1,OtherCodeSeg,,ATCE,,>
Other_Sel = Other-GDT
;----------------------------------------------------------------------------
GDTLen = $-GDT ;全局描述符表长度
GDNum = ($-EFFGDT)/(SIZE Desc) ;需处理基地址的描述符个数
;--------------------------,-------------------------------------------------
GDTSeg ENDS ;全局描述符表段定义结束
;----------------------------------------------------------------------------
IDTSeg SEGMENT PARA USE16 ;中断描述符表数据段(16位)
;----------------------------------------------------------------------------
IDT LABEL BYTE ;中断描述符表
;0--7的8个陷阱门描述符
REPT 8
Gate <OtherBegin,Other_Sel,,AT386TGate,>
ENDM
;对应8号(时钟)中断处理程序的门描述符
Gate <TIBegin,TICode_Sel,,AT386IGate,>
;从9--0fch的245个陷阱门描述符
REPT 244
Gate <OtherBegin,Other_Sel,,AT386TGate,>
ENDM
;0fdh号任务门描述符(对应读键盘中断处理任务)
Gate <,KeyTSS_Sel,,ATTaskGate,>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -