📄 int8259.asm
字号:
DATA SEGMENT
DIS DB 'THIS IS A 8259A INTERRUPPT!',0DH,0AH,'$'
KEEPIMR DB ?
INTA00 EQU 020H ;A0=0
INTA01 EQU 021H ;A0=1
EOI EQU 20H
INT_TYPE EQU 08H ;起始中断号
INTIRQ3 EQU 0BH
IMRIRQ3 EQU 11110111B;
DATA ENDS
STACK SEGMENT
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
CLI ;关中断
MOV AH,35H ;取原中断向量
MOV AL,INTIRQ3
INT 21H
PUSH BX
PUSH ES
PUSH DS
MOV AX,SEG INTPROC
MOV DS,AX
MOV DX,OFFSET INTPROC
MOV AH,25H ;送入新中断向量
MOV AL,INTIRQ3
INT 21H
POP DS
IN AL,INTA01 ;OCW1取屏蔽字
MOV KEEPIMR,AL ;保存屏蔽字
AND AL,IMRIRQ3 ;开IRQ1(键盘),IRQ3中断
OUT INTA01,AL ;开IRQ3中断源
MOV BX,10 ;共10次
STI
CMP BX,0H ;BX=0?
JZ A22
NEXT: MOV AH,01H ;读按键
INT 16H
JZ NEXT
MOV AH,0H ;读键值
INT 16H
CMP AL,'y'
JNZ NEXT
A22: MOV AL,KEEPIMR ;恢复原中断屏蔽字
OUT INTA01,AL
POP ds
POP dX
MOV AH,25H ;DS:DX置换AL中中断向量号对应的绝对地址
MOV AL,INTIRQ3 ;恢复原中断向量
INT 21H
MOV AH,4CH ;返回DOS
INT 21H
;用户中断程序
INTPROC PROC FAR
STI ;开中断
PUSH AX
PUSH BX
PUSH DS
MOV AX,DATA
MOV DS,AX
A00: MOV AH,07H ;下滚当前页调用(开窗口)
MOV AL,1 ; 下滚行数
MOV CH,5 ;左上角
MOV CL,10
MOV DH,20 ;右下角
MOV DL,65
INT 10H
MOV AH,02H ;定位光标
MOV DH,0 ;光标行列
MOV DL,0
INT 10H
LEA DX,DIS ;显示
MOV AH,09H
INT 21H
MOV AL,EOI ;发EOI命令
OUT INTA00,AL
POP DS
POP BX
POP AX
DEC BX
STI
IRET ;中断返回
INTPROC ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -