📄 dtos.asm
字号:
mov al,11111101b
out IMREGP,al ;只开发时钟中断
MOV DL,0FFH
MOV AH,06H
INT 21H
mov dl,al
mov ax,BufferSeg
mov es,ax
mov BYTE PTR es:KeyASCII,dl ;保存到缓冲数据段
cli ;准备返回保护方式
lidt QWORD PTR VIDTR
mov eax,cr0
or al,1
mov cr0,eax
JUMP16 <KeyCode_Sel>,<OFFSET KeyV>
KeyV: mov ax,KeyStack_Sel ;又进入保护方式
mov ss,ax
mov esp,ebp
pop gs
pop fs
pop es
pop ds
mov al,EOICOM ;通知中断控制器中断处理结束
out ICREGP,al
iretd
jmp KeyBegin
KeyBegin ENDP
;----------------------------------------------------------------------------
KeyCodeLen = $
KeyCodeSeg ENDS
;----------------------------------------------------------------------------
DispLDTSeg SEGMENT PARA USE16
;----------------------------------------------------------------------------
DiLDT LABEL BYTE
;代码段描述符及选择子
DispData Desc <DispDataLen-1,DispDataSeg,,ATDW,,>
DispData_Sel = DispData-DiLDT+TIL
DispCode Desc <0ffffh,DispCodeSeg,,ATCE,,>
DispCode_Sel = DispCode-DiLDT+TIL
;堆栈段描述符及选择子
DispStack Desc <DispStackLen-1,DispStackSeg,,ATDWA,,>
DispStack_Sel = DispStack-DiLDT+TIL
;----------------------------------------------------------------------------
DispLDNum = ($-DiLDT)/(SIZE Desc) ;需初始化基地址的描述符个数
DispLDTLen = $ ;局部描述符表段长度
;----------------------------------------------------------------------------
DispLDTSeg ENDS
;----------------------------------------------------------------------------
;读键盘任务TSS段
;----------------------------------------------------------------------------
DispTSSSeg SEGMENT PARA USE16
DD 0 ;链接字
DD ? ;0级堆栈指针
DW ?,?
DD ? ;1级堆栈指针
DW ?,?
DD ? ;2级堆栈指针
DW ?,?
DD 0 ;CR3
DW DispBegin,0 ;EIP
DD 0 ;EFLAGS
DD 0 ;EAX
DD 0 ;ECX
DD 0 ;EDX
DD 0 ;EBX
DW DispStackLen,0 ;ESP
DD 0 ;EBP
DD 0 ;ESI
DD 0 ;EDI
DW Normal_Sel,0 ;ES
DW DispCode_Sel,0 ;CS
DW DispStack_Sel,0 ;SS
DW Normal_Sel,0 ;DS
DW Normal_Sel,0 ;FS
DW Normal_Sel,0 ;GS
DW DispLDT_Sel,0 ;LDTR
DW 0 ;调试陷阱标志
DW $+2 ;指向I/O许可位图的偏移
DB 0ffh ;I/O许可位图结束字节
DispTSSLen = $
DispTSSSeg ENDS
;----------------------------------------------------------------------------
DispDataSeg SEGMENT PARA USE16
DCTBL0 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DispDataLen = $
DispDataSeg ENDS
;----------------------------------------------------------------------------
DispStackSeg SEGMENT PARA USE16
DispStackLen = 1024
DB DispStackLen DUP(0)
DispStackSeg ENDS
;----------------------------------------------------------------------------
;读键盘任务代码段
;----------------------------------------------------------------------------
DispCodeSeg SEGMENT PARA USE16
ASSUME CS:DispCodeSeg,DS:DispDataSeg,ES:BufferSeg
;----------------------------------------------------------------------------
DispBegin PROC FAR
DST: mov ax,DispData_Sel
mov ds,ax
mov ax,XBuffer_Sel
mov es,ax
mov ax,XBuffer_Sel
mov fs,ax
mov ax,XBuffer_Sel
mov gs,ax
MOV AL,BYTE PTR fs:NOW
MOV BX,OFFSET DCTBL0
XLAT
MOV DX,289H
OUT DX,AL
JUMP16 DemoTSS_Sel,0
JMP DST
DispBegin ENDP
;----------------------------------------------------------------------------
DispCodeLen = $
DispCodeSeg ENDS
;--------------------------------------------------,-------------------------
LedLDTSeg SEGMENT PARA USE16
;----------------------------------------------------------------------------
LeLDT LABEL BYTE
;代码段描述符及选择子
LedCode Desc <0ffffh,LedCodeSeg,,ATCE,,>
LedCode_Sel = LedCode-LeLDT+TIL
;堆栈段描述符及选择子
LedStack Desc <LedStackLen-1,LedStackSeg,,ATDWA,,>
LedStack_Sel = LedStack-LeLDT+TIL
;----------------------------------------------------------------------------
LedLDNum = ($-LeLDT)/(SIZE Desc) ;需初始化基地址的描述符个数
LedLDTLen = $ ;局部描述符表段长度
;----------------------------------------------------------------------------
LedLDTSeg ENDS
;----------------------------------------------------------------------------
;读键盘任务TSS段
;----------------------------------------------------------------------------
LedTSSSeg SEGMENT PARA USE16
DD 0 ;链接字
DD ? ;0级堆栈指针
DW ?,?
DD ? ;1级堆栈指针
DW ?,?
DD ? ;2级堆栈指针
DW ?,?
DD 0 ;CR3
DW LedBegin,0 ;EIP
DD 0 ;EFLAGS
DD 0 ;EAX
DD 0 ;ECX
DD 0 ;EDX
DD 0 ;EBX
DW LedStackLen,0 ;ESP
DD 0 ;EBP
DD 0 ;ESI
DD 0 ;EDI
DW Normal_Sel,0 ;ES
DW LedCode_Sel,0 ;CS
DW LedStack_Sel,0 ;SS
DW Normal_Sel,0 ;DS
DW Normal_Sel,0 ;FS
DW Normal_Sel,0 ;GS
DW LedLDT_Sel,0 ;LDTR
DW 0 ;调试陷阱标志
DW $+2 ;指向I/O许可位图的偏移
DB 0ffh ;I/O许可位图结束字节
LedTSSLen = $
LedTSSSeg ENDS
;----------------------------------------------------------------------------
LedStackSeg SEGMENT PARA USE16
LedStackLen = 1024
DB LedStackLen DUP(0)
LedStackSeg ENDS
;----------------------------------------------------------------------------
;读键盘任务代码段
;----------------------------------------------------------------------------
LedCodeSeg SEGMENT PARA USE16
ASSUME CS:LedCodeSeg,ES:BufferSeg
;----------------------------------------------------------------------------
LedBegin PROC FAR
LEST:
mov ax,XBuffer_Sel
mov es,ax
mov ax,XBuffer_Sel
mov fs,ax
mov ax,XBuffer_Sel
mov gs,ax
PUSH AX
PUSH DS
MOV AL,01H ;AL置1
MOV CL,BYTE PTR fs:NUM1
DEC CL
SHL AL,CL ;AL左移NUM1-1位
MOV BL,AL
MOV AL,01H
MOV CL,BYTE PTR fs:NUM2
DEC CL
SHL AL,CL
ADD AL,BL
MOV DX,288H ;8255 A口输出
OUT DX,AL
POP DS
POP AX
JUMP16 DemoTSS_Sel,0
JMP LEST
LedBegin ENDP
;----------------------------------------------------------------------------
LedCodeLen = $
LedCodeSeg ENDS
;--------------------------------------------------,-------------------------
;其它中断或异常处理程序的代码段
;----------------------------------------------------------------------------
OtherCodeSeg SEGMENT PARA USE16
ASSUME CS:OtherCodeSeg
;----------------------------------------------------------------------------
OtherBegin PROC FAR
mov si,OFFSET MessOther
int 0feh ;显示提示信息
mov WORD PTR es:[0],ax
jmp $ ;进入无限循环
OtherBegin ENDP
;----------------------------------------------------------------------------
OtherCodeLen = $
OtherCodeSeg ENDS
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;缓冲区数据段
;----------------------------------------------------------------------------
BufferSeg SEGMENT PARA USE16
KeyASCII DB ?
NOW DB ?
NUM1 DB 0
NUM2 DB 0
FLAG DB 0
Buffer DB 128 DUP(?)
BufferLen = $
BufferSeg ENDS
;----------------------------------------------------------------------------
;演示任务局部描述符表段
;----------------------,-,---------------------------------------------------
DemoLDTSeg SEGMENT PARA USE16
;----------------------------------------------------------------------------
DLDT LABEL BYTE
;演示任务TSS段作为数据段的描述符及选择子
ToDemoTSS Desc <DemoTSSLen-1,DemoTSSSeg,,ATDW,,>
ToDemoTSS_Sel = ToDemoTSS-DLDT+TIL
;演示任务堆栈段描述符及选择子
DemoStack Desc <DemoStackLen-1,DemoStackSeg,,ATDWA,,>
DemoStack_Sel = DemoStack-DLDT+TIL
;演示任务数据段描述符及选择子
DemoData Desc <DemoDataLen-1,DemoDataSeg,,ATDW,,>
DemoData_Sel = DemoData-DLDT+TIL
;----------------------------------------------------------------------------
DemoLDNum = ($-DLDT)/(SIZE Desc) ;LDT描述符个数
DemoLDTLen =$
;----------------------------------------------------------------------------
DemoLDTSeg ENDS
;------,---------------------------------------------------------------------
;演示任务TSS段
;-----------------------------------------------------------------------,-,--
DemoTSSSeg SEGMENT PARA USE16
DemoTaskSS TSS <>
DB 0ffh
DemoTSSLen = $
DemoTSSSeg ENDS
;----------------------------------------------------------------------------
;演示任务的堆栈段
;----------------------------------------------------------------------------
DemoStackSeg SEGMENT PARA USE16
DemoStackLen = 1024
DB DemoStackLen DUP(0)
DemoStackSeg ENDS
;----------------------------------------------------------------------------
;演示任务的数据段
;----------------------------------------------------------------------------
DemoDataSeg SEGMENT PARA USE16
MessOther DB 'Other Exception',0
savemask db 0
DemoDataLen = $
DemoDataSeg ENDS
;----------------------------------------------------------------------------
;演示任务的代码段
;----------------------------------------------------------------------------
DemoCodeSeg SEGMENT PARA USE16
ASSUME CS:DemoCodeSeg,DS:DemoDataSeg
;--------------------------------------------------------------,-------------
DemoBegin PROC FAR
mov ax,DemoLDT_Sel
lldt ax ;装载LDTR
mov ax,DemoStack_Sel ;置堆栈
mov ss,ax
mov esp,DemoStackLen
mov ax,ToDemoTSS_Sel
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -