📄 interrupt.txt
字号:
CODE SEGMENT
ASSUME CS: CODE
NEW_INT: ;接收字符的中断处理程序
STI ;CPU开中断
MOV DX , 3F8H ;接收字符
IN AL , DX
MOV DL , AL ;显示接收字符
MOV AH , 2
INT 21H
CMP DL , 0DH ;判断是否为回车
JNZ L2 ;不是,转L2处
MOV DL , 0AH ;若是,加显示一个换行符
MOV AH , 2
INT 21H
L2:
MOV AL , 20H ;发中断结束命令(EOI)
OUT 20H , AL
IRET
START: ;主程序部分
MOV AH , 35H
MOV AL , 0CH
INT 21H ;读取原0CH号中断服务程序的地址
PUSH BX
PUSH ES ;以上地址入栈保存(以便在程序退出时再恢复中断矢量表中的内容)
MOV AX , CS
MOV DS , AX
MOV DX , OFFSET NEW_INT
MOV AH , 25H
MOV AL , 0CH
INT 21H ;修改中断矢量表,将NET_INT位置登记为0CH号中断服务程序的地址
;以下初始化8250
MOV DX , 3FBH ;指向线路控制寄存器
MOV AL , 80H ;位7置1
OUT DX , AL ;发送此字节
MOV DX , 3F9H ;指向波特率除数的高字节
MOV AL , 0 ; 1200 BPS对应的高字节
OUT DX , AL ;发送此字节
DEC DX ;指向波特率除数的低字节
MOV AL , 60H ; 1200 BPS对应的低字节
OUT DX , AL ;发送此字节
MOV AL , 1BH ;数据长度为8位 , 1个奇偶校验位 , 偶校验 , 1个停止位
MOV DX , 3FBH ;指向线路控制寄存器
OUT DX , AL ;发送此字节
MOV DX , 3FCH ;设置MODEM控制寄存器
MOV AL , 0BH ;允许8250发中断
OUT DX , AL
MOV DX , 3F9H ;指向中断允许寄存器
MOV AL , 1 ;允许数据接收准备好中断
OUT DX , AL ;发送此字节
CLI ;关中断,以便对中断控制器8259A进行操作
IN AL , 21H ;读取中断屏蔽寄存器的内容
AND AL , 0EFH ;将COM1中断(即IRQ4引脚)的对应位置0,允许中断。
OUT 21H , AL ;写入中断控制器8259A中
STI ;开中断
L1: ; 主程序循环,等待收到字符的中断发生。
MOV AH , 0
INT 16H ;读取键盘字符
CMP AL , 03 ;比较是否为CTRL-C键
JNZ L1 ;若不是,继续循环
EXIT: ;退出处理
MOV AH , 25H
MOV AL , 0CH
POP DS
POP DX
INT 21H ;恢复中断矢量表中0CH号中断服务程序的原地址。
MOV AH , 4CH
INT 21H ;返回DOS
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -