我将中断例程放在最前面,使得它在安装后仍能找到正确的偏移地址,同时将中断例程的CS值设为20h,IP值设为0,方便寻址。
完整程序如下:
ASSUME CS:CODE
CODE SEGMENT
INT7C: JMP SHORT INT7C_B
TABLE DW SUB0,SUB1,SUB2,SUB3
INT7C_B: PUSH BX
CMP AH,3
JA INT7C_Q
MOV BL,AH
MOV BH,0
ADD BX,BX
CALL TABLE[BX]
INT7C_Q: POP BX
IRET
SUB0: PUSH ES
PUSH DI
PUSH CX
MOV CX,0B800H
MOV ES,CX
MOV DI,0
MOV CX,4000
SUB0_S: MOV BYTE PTR ES:[DI],' '
ADD DI,2
LOOP SUB0_S
POP CX
POP DI
POP ES
RET
SUB1: PUSH ES
PUSH DI
PUSH CX
MOV CX,0B800H
MOV ES,CX
MOV DI,0
MOV CX,4000
SUB1_S: AND BYTE PTR ES:[DI+1],11111000B
OR ES:[DI+1],AL
ADD DI,2
LOOP SUB1_S
POP CX
POP DI
POP ES
RET
SUB2: PUSH ES
PUSH DI
PUSH AX
PUSH CX
MOV CL,4
SHL AL,CL
MOV CX,0B800H
MOV ES,CX
MOV DI,0
MOV CX,4000
SUB2_S: AND BYTE PTR ES:[DI+1],10001111B
OR ES:[DI+1],AL
ADD DI,2
LOOP SUB2_S
POP CX
POP AX
POP DI
POP ES
RET
SUB3: PUSH CX
PUSH DI
PUSH SI
PUSH DS
PUSH ES
MOV CX,0B800H
MOV ES,CX
MOV DS,CX
MOV SI,0A0H
MOV DI,0
MOV CX,49
SUB3_R: PUSH CX
MOV CX,80
CLD
REP MOVSW
POP CX
LOOP SUB3_R
MOV CX,80
MOV DI,0
SUB3_LR: MOV BYTE PTR ES:[DI+160*24],' '
ADD DI,2
LOOP SUB3_LR
POP ES
POP DS
POP SI
POP DI
POP CX
RET
INT7CEND: NOP
START: MOV AX,0
MOV ES,AX
MOV DI,200H
PUSH CS
POP DS
MOV SI,OFFSET INT7C
MOV CX,OFFSET INT7CEND-OFFSET INT7C
CLD
REP MOVSB
MOV WORD PTR ES:[7CH*4],0
MOV WORD PTR ES:[7CH*4+2],20H
MOV AX,4C00H
INT 21H
CODE ENDS
END START