📄 int-60h.asm
字号:
DATA SEGMENT
OFF_0 DW ? ;中断向量偏移地址
SEG_0 DW ? ;中断向量段地址
MASK_I DB ? ;系统原始中断屏蔽字
TN DB 0 ;延时常数,已给定,1秒为18次
bcd1 db 1
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,3560H ;取原中断向量
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,60H
INT 21H
POP DS
STI
mov DX,offset OK
MOV AH,09H
INT 21H
W1: INT 60H
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
;恢复原中断
MOV DX,OFF_0
PUSH DS
MOV DS,SEG_0
MOV AX,2560H
INT 21H
POP DS
MOV AX,4C00H ;返回DOS
INT 21H
;----------------------------
;新中断服务程序
NEWINT PROC FAR ;新IRQ0中服程序
PUSH AX ;保护现场
PUSH BX
MOV AH,00H
INT 1AH ;读计时单位(=55ms),
ADD DX,18
MOV BX,DX
MOV AH,00H
INT 1AH
CMP BX,DX ;满1秒?,否,继续累计
JNZ L1
MOV DL,'1'
MOV AH,2
INT 21H
L1: POP BX
POP AX
IRET
NEWINT ENDP
;--------------------------------
DISP PROC NEAR ;入口:BCD1=DL=字符
PUSH AX
MOV DL,BCD1
MOV AH,02H ;DOS调用,显示一个字符
INT 21H
INC BCD1
CMP BCD1,'9'
JBE EXIT
MOV BCD1,'0'
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
EXIT: POP AX
RET
DISP ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -