程序首先关中断,然后保存系统的1CH型中断向量,然后写入用户的1CH型中断向量。然后开中断。
在主程序中,不断判断COUNT是否为0,如果COUNT为0,则表示已经显示了所有要显示的字符串,调用RESET子程序恢复原始的1CH型中断向量。如果不为0,则不进行任何操作。
在1CH型中断服务子程序中,首先保护现场,重新定义用户数据段,然后中断计数ICOUNT,如果满了18次,则执行显示字符串,并将ICOUNT重新置18,且COUNT减1,否则直接退出。退出中断服务的时候要恢复现场。
.486
DATA SEGMENT USE16
MESG DB 'B15040317',0DH,0AH,'$'
OLD1C DD ?
ICOUNT DB 9
COUNT DB 10
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
CLI
CALL READ1C
CALL WRITE1C
STI
SCAN: CMP COUNT,0
JNZ SCAN
CALL RESET
MOV AH,4CH
INT 21H
SERVICE PROC
PUSHA
PUSH DS
MOV AX,DATA
MOV DS,AX
DEC ICOUNT
JNZ EXIT
MOV ICOUNT,9
DEC COUNT
MOV AH,9
LEA DX,MESG
INT 21H
EXIT: POP DS
POPA
IRET
SERVICE ENDP
READ1C PROC
MOV AX,351CH
INT 21H
MOV WORD PTR OLD1C,BX
MOV WORD PTR OLD1C+2,ES
RET
READ1C ENDP
WRITE1C PROC
PUSH DS
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET SERVICE
MOV AX,251CH
INT 21H
POP DS
RET
WRITE1C ENDP
RESET PROC
MOV DX,WORD PTR OLD1C
MOV DS,WORD PTR OLD1C+2
MOV AX,251CH
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG