📄 int-1ch.asm
字号:
DATA SEGMENT
OFF_0 DW ? ;中断向量偏移地址
SEG_0 DW ? ;中断向量段地址
MASK_I DB ? ;系统原始中断屏蔽字
TN DB '0 ' ,'s' ;延时常数,已给定,1秒为18次
CONT db 0
OK DB 'How are you?$',0DH,0AH
DATA ENDS
STACK SEGMENT
DW 50 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:stack
start: MOV AX,DATA ;Initial
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,50
MOV SP,AX
;取原IR0中断向量
MOV AX,351CH ;取原中断向量
INT 21H
MOV SEG_0,ES ;保存原中断向量
MOV OFF_0,BX
;设置新中断向量
CLI
PUSH DS
MOV DX,OFFSET NEWINT
MOV AX,SEG NEWINT
MOV DS,AX
MOV AH,25H
MOV AL,1CH
INT 21H
POP DS
STI
mov DX,offset OK
MOV AH,09H
INT 21H
W1: MOV DL,TN
MOV AH,2
INT 21H
MOV AH,0BH ;有键按下?
int 21H
CMP AL,00H ;无键按下,转W1,否则,调用1S延时子程序
JZ W1
MOV AH,08H ;有键,读键值AL
INT 21H
CMP AL,1BH ;是ESC键?
JNZ W1 ;是,退出,否,转W1
;恢复原中断
cli
MOV DX,OFF_0
PUSH DS
MOV DS,SEG_0
MOV AX,251CH
INT 21H
POP DS
STI
MOV AX,4C00H ;返回DOS
INT 21H
;----------------------------
;新中断服务程序
NEWINT PROC FAR ;新IRQ0中服程序
PUSH AX ;保护现场
MOV AX,DATA
MOV DS,AX
ASSUME DS:DATA
INC CONT ;1/18S,+1
CMP CONT,18 ;满1秒?,否,继续累计
JB L1
MOV CONT,0
INC TN
CMP TN,'9'
JBE L1
MOV TN,'0'
L1: POP AX
IRET
NEWINT ENDP
;--------------------------------
DISP PROC NEAR ;入口:TN=DL=字符
PUSH AX
MOV DL,TN
MOV AH,02H ;DOS调用,显示一个字符
INT 21H
INC TN
CMP TN,'9'
JBE EXIT
MOV TN,'0'
EXIT: POP AX
RET
DISP ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -