?? 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 + -