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

📄 asm6.asm.txt

📁 hen hao de yi guai ruanjian
💻 TXT
📖 第 1 页 / 共 2 页
字号:
名称:ASM6.ASM
;功能:演示中断处理的实现
;编译:TASM ASM6.ASM
;连接:TLINK ASM6.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,,>
        ;视频缓冲区段描述符(DPL=3)
VideoBuf    Desc  <0ffffh,8000h,0bh,ATDW,,>
;----------------------------------------------------------------------------
EFFGDT     LABEL  BYTE
        ;临时代码段描述符
TempCode    Desc  <0ffffh,TempCodeSeg,,ATCE,,>
        ;演示代码段描述符
DemoCode    Desc  <DemoCodeLen-1,DemoCodeSeg,,ATCE,,>
        ;演示数据段描述符
DemoData    Desc  <DemoDataLen-1,DemoDataSeg,,ATDW,,>
        ;演示堆栈段描述符
DemoStack    Desc  <DemoStackLen-1,DemoStackSeg,,ATDWA,,>
        ;0feh号中断处理程序(显示程序)代码段描述符
EchoCode    Desc  <EchoCodeLen-1,EchoCodeSeg,,ATCE,,>
        ;0feh号中断处理程序(显示程序)数据段描述符
EchoData    Desc  <EchoDataLen-1,EchoDataSeg,,ATDW,,>
        ;8号中断处理程序代码段描述符
TICode     Desc  <TICodeLen-1,TICodeSeg,,ATCE,,>
        ;8号中断处理程序数据段描述符
TIData     Desc  <TIDataLen-1,TIDataSeg,,ATDW,,>
        ;其它中断或异常处理程序代码段描述符
Other      Desc  <OtherCodeLen-1,OtherCodeSeg,,ATCE,,>
;----------------------------------------------------------------------------
GDTLen     =    $-GDT           ;全局描述符表长度
GDNum      =    ($-EFFGDT)/(SIZE Desc)  ;需特殊处理的描述符数
;----------------------------------------------------------------------------
Normal_Sel   =    Normal-GDT        ;规范段描述符选择子
Video_Sel    =    VideoBuf-GDT       ;视频缓冲区段描述符选择子
;----------------------------------------------------------------------------
TempCode_Sel  =    TempCode-GDT       ;临时代码段的选择子
DemoCode_Sel  =    DemoCode-GDT       ;演示代码段的选择子
DemoData_Sel  =    DemoData-GDT       ;演示数据段的选择子
DemoStack_Sel  =    DemoStack-GDT       ;演示堆栈段的选择子
EchoCode_Sel  =    EchoCode-GDT       ;0feh号中断程序代码段选择子
EchoData_Sel  =    EchoData-GDT       ;0feh号中断程序数据段选择子
TICode_Sel   =    TICode-GDT        ;8号中断程序代码段选择子
TIData_Sel   =    TIData-GDT        ;8号中断程序数据段选择子
Other_Sel    =    Other-GDT         ;其它中断或异常代码段选择子
;----------------------------------------------------------------------------
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--0fdh的245个陷阱门描述符
        REPT  245
        Gate  <OtherBegin,Other_Sel,,AT386TGate,>
        ENDM
        ;对应0feh号中断处理程序的陷阱门描述符
        Gate  <EchoBegin,EchoCode_Sel,,AT386TGate,>
        ;对应0ffh号中断处理程序的陷阱门描述符
        Gate  <OtherBegin,Other_Sel,,AT386TGate,>
;----------------------------------------------------------------------------
IDTLen     =    $-IDT
;----------------------------------------------------------------------------
IDTSeg     ENDS               ;中断描述符表段定义结束
;----------------------------------------------------------------------------
;其它中断或异常处理程序的代码段
;----------------------------------------------------------------------------
OtherCodeSeg  SEGMENT PARA USE16
        ASSUMECS:OtherCodeSeg
;----------------------------------------------------------------------------
OtherBegin   PROC  FAR
        mov   ax,Video_Sel
        mov   es,ax
        mov   ah,17h          ;在屏幕左上角显示兰底白字
        mov   al,'!'          ;符号"!"
        mov   WORD PTR es:[0],ax
        jmp   $             ;无限循环
OtherBegin   ENDP
;----------------------------------------------------------------------------
OtherCodeLen  =    $
OtherCodeSeg  ENDS
;----------------------------------------------------------------------------
;8号中断处理程序的数据段
;----------------------------------------------------------------------------
TIDataSeg    SEGMENT PARA USE16
Count      DB   0             ;中断发生的计数器
TIDataLen    =    $
TIDataSeg    ENDS
;----------------------------------------------------------------------------
;8号中断处理程序的代码段
;----------------------------------------------------------------------------
TICodeSeg    SEGMENT PARA USE16
        ASSUME CS:TICodeSeg,DS:TIDataSeg
;----------------------------------------------------------------------------
TIBegin     PROC  FAR
        push  eax            ;保护现场
        push  ds
        push  fs
        push  gs
        mov   ax,TIData_Sel       ;置中断处理程序数据段
        mov   ds,ax
        mov   ax,EchoData_Sel      ;置显示过程数据段
        mov   fs,ax
        mov   ax,DemoData_Sel      ;置演示程序数据段
        mov   gs,ax
        cmp   Count,0
        jnz   TI2            ;计数非0表示未到1秒
        mov   Count,18         ;每秒约18次
        int   0feh           ;调用0FEH号中断处理程序显示
        cmp   BYTE PTR fs:Mess,'0'
        jnz   TI1
        mov   BYTE PTR gs:Flag,1    ;显示符号'0'时置标记
TI1:      dec   BYTE PTR fs:Mess     ;调整显示符号
TI2:      dec   Count           ;调整计数
        pop   gs            ;恢复现场
        pop   fs
        pop   ds
        mov   al,EOICOM         ;通知中断控制器中断处理结束
        out   ICREGP,al
        pop   eax
        iretd               ;中断返回
TIBegin     ENDP
;----------------------------------------------------------------------------
TICodeLen    =    $
TICodeSeg    ENDS
;----------------------------------------------------------------------------
;0FEH号中断处理程序数据段
;----------------------------------------------------------------------------
EchoDataSeg   SEGMENT PARA USE16
Mess      DB   '8',4eh
EchoDataLen   =    $
EchoDataSeg   ENDS
;----------------------------------------------------------------------------
;0FEH号中断处理程序(显示程序)的代码段
;----------------------------------------------------------------------------
EchoCodeSeg   SEGMENT PARA USE16
        ASSUME CS:EchoCodeSeg,DS:EchoDataSeg

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -