📄 8259.asm
字号:
;8259A中断控制器实验
DATA SEGMENT
OLDBX DW ? ;保存原中断矢量
OLDES DW ?
MESS DB ,0AH,0DH,' THIS IS A 8259A INTERRUPT$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
;初始化附加8259
MOV AL,13H ;ICW1
MOV DX,210H
OUT DX,AL
MOV AL,0C0H ;ICW2
MOV DX,211H
OUT DX,AL
MOV AL,0F8H ;OCW1
OUT DX,AL
MOV AL,0 ;OCW2
MOV DX,210H
OUT DX,AL
MOV AL,0BH ;OCW3
OUT DX,AL
MOV AX,350FH ;取原中断矢量
INT 21H
MOV OLDBX,BX
MOV OLDES,ES
MOV AX,SEG NEW0FH ;设置新中断矢量
MOV DS,AX
MOV DX,OFFSET NEW0FH
MOV AX,250FH
INT 21H
IN AL,21H ;开IRQ7
AND AL,07FH
OUT 21H,AL
MOV DX,211H ;开附加8259
IN AL,DX
AND AL,0
OUT DX,AL
STI
LOOP1:
IN AL,21H
OR AL,80H
OUT 21H,AL
MOV AH,1 ;按任意键退出
INT 16H
PUSHF
IN AL,21H
AND AL,07FH
OUT 21H,AL
MOV DX,211H
IN AL,DX
AND AL,0
OUT DX,AL
POPF
JZ LOOP1
IN AL,21H ;关IRQ7
OR AL,80H
OUT 21H,AL
MOV AX,OLDES ;恢复原中断矢量
MOV DS,AX
MOV DX,OLDBX
MOV AX,250FH
INT 21H
MOV AH,4CH
INT 21H
;中断服务程序
NEW0FH:
IN AL,21H ;关IRQ7
OR AL,80H
OUT 21H,AL
MOV AX,DATA ;显示MESS
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,9
INT 21H
MOV DX,210H
IN AL,DX
IN AL,DX
IN AL,DX
IN AL,DX
CALL SHOW ;显示附加8259的中断
IN AL,21H
AND AL,07FH ;开IRQ7
OUT 21H,AL
MOV DX,211H
IN AL,DX
AND AL,0
OUT DX,AL
MOV AL,20H ;发附加8259中断结束命令
MOV DX,210H
OUT DX,AL
MOV AL,20H ;给主8259发中断结束命令
OUT 20H,AL
IRET
;显示子程序
SHOW PROC
TEST AL,01H
JZ N1
MOV DL,'0'
MOV AH,2
INT 21H
N1:TEST AL,02H
JZ N2
MOV DL,'1'
MOV AH,2
INT 21H
N2:TEST AL,04H
JZ N3
MOV DL,'2'
MOV AH,2
INT 21H
N3:TEST AL,08H
JZ N
MOV DL,'3'
MOV AH,2
INT 21H
N:RET
SHOW ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -