📄 int79h.asm
字号:
;编写一个自定义INT 79H的中断服务程序
DATA SEGMENT
STRING1 DB 'Do you want to writing?(y/n):','$'
STRING2 DB ' BYEBYE!','$'
STRING3 DB ' WRONG,PLEASE CHOOSE AGAIN.','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV AL,79H ; 使用dos功能调用存取中断向量
MOV AH,35H
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV AX,SEG WORD1
MOV DS,AX
MOV DX,OFFSET WORD1
MOV AL,79H
MOV AH,25H
INT 21H
POP DS
MOV CX,5H
CALL CLEAR
LOOP1: MOV AH,01H ;从键盘输入一字符
INT 21H
CMP AL,'Y'
JE INQR
MOV AH,09 ;在品红的背景下显示浅绿色的闪烁星
MOV AL,'*'
MOV BH,0
MOV BL,0DAH
MOV CX,CX
INT 10H
ADD CX,1
MOV DL,0
INC DH
LOOP LOOP1
INQR: ;中断
INT 79H
POP DX ;中断还原
POP DS
MOV AL,79H
MOV AH,25H
INT 21H
RET
MAIN ENDP
WORD1 PROC NEAR ; 实现简单的字处理程序功能
;光标可以上下左右移动,可写字符,删字符
INPUT: MOV AH,02H ;回车,换行
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV DL,0
MOV AH,09H ;输出字符串string1
LEA DX,STRING1
INT 21H
MOV AH,01H ;从键盘输入一字符
INT 21H
CMP AL,'N' ;'N'与'Y'的选择
jE NO
JNE CMP2
CMP2:
CMP AL,'Y'
jE YES
MOV AH,02H ;回车,换行
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH,09H
LEA DX,STRING3
INT 21H
MOV AH,02H ;回车,换行
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
JMP INPUT
YES: JMP WRITING
NO: MOV AH,02H ;回车,换行
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH,09H
LEA DX,STRING2
INT 21H
MOV AX,4C00H
INT 21H
WRITING:
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
STI
CALL CLEAR ;调用清屏子程序
MOV AL,03H
INT 10H
MOV BH,0
MOV DH,10
MOV DL,10
MOV AH,2
INT 10H ;将光标设置在中央
TOP: MOV AH,0
INT 16H
DOWN :CMP AH,50H ;下
JNZ RIGHT
MOV AH,3
MOV BH,0
INT 10H
INC DH
MOV AH,2
INT 10H
JMP NEXT
RIGHT: CMP AH,4DH ;右
JNZ UP
MOV AH,3
MOV BH,0
INT 10H
CMP DL,79 ;判断是不是到了最后一列
JZ NEXT1 ;是,跳转
INC DL ;不是,列号加1
DONE:MOV AH,2
INT 10H
JMP NEXT
NEXT1: ;若是最后一列,则光标转道下一行的第一列
INC DH
MOV DL,0
JMP DONE
UP: CMP AH,48H ;上
JNZ LEFT
MOV AH,3
MOV BH,0
INT 10H
CMP DH,1
JZ NEXT
DEC DH
MOV AH,2
INT 10H
JMP NEXT
LEFT: CMP AH,4BH ;左
JNZ ESC1
MOV AH,3
MOV BH,0
INT 10H
CMP DL,1 ;判断是不是第一列
JZ NEXT2 ;是,跳转
DEC DL ;不是,列号减1
D: MOV AH,2
INT 10H
JMP NEXT
NEXT2: CMP DH,1 ;是第一列,再判断是不是第一行的第一列
JNZ DDD ;如果不是,转DDD
JMP NEXT ;如果是,说明当前光标位于第一行,第一列,
;所以光标不动,继续循环
DDD: DEC DH
MOV DL,79
JMP D
ESC1: CMP AL,1BH ;退出
JNZ BACK
JMP EXIT
BACK: CMP AL,08H ;BACK键
JNZ ENTER
MOV DL,AL
MOV AH,2
INT 21H
MOV DL,20H
MOV AH,2
INT 21H
MOV AH,3
MOV BH,0
INT 10H
DEC DL
MOV AH,2
INT 10H
JMP NEXT
ENTER: CMP AL,0DH ;ENTER键
JNZ DEFAULT
MOV AH,3
MOV BH,0
INT 10H
INC DH ;若是回车键,则转道下一行(INC DH)
MOV DL,0 ;的第一列(MOV DL,0)
MOV AH,2
INT 10H
JMP NEXT
DEFAULT: MOV DL,AL ;其它键
MOV AH,2
INT 21H
NEXT: JMP TOP
EXIT: MOV AH,4CH ;ESC键退出
INT 21H
WORD1 ENDP
CLEAR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,0600H ;ah=06(滚动)al=00(全屏空白)
MOV BH,0FH ;黑色背景(0) 白色前景(f)
SUB CX,CX ;左上角行:列
MOV DX,184FH ;右下角行:列
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CLEAR ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -