⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtos.asm

📁 我自己编写的一个保护模式下实现任务切换的系统软件
💻 ASM
📖 第 1 页 / 共 4 页
字号:
                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 + -