8086 汇编 一个能控制ctrl+c 和ctrl+break 的例子,研究一天了,在线等
此程序为什么运行的时候不显示字符,确实能阻止ctrl+c 和ctrl+break,如果
把
CMP AH,1
JZ PKEY1
CMP AH,11H
JZ PKEY1
注释掉,那么就显示字符,不过按了ctrl+c 之后,不退出,但是按下一个字符显示^c和退出,我不知道在mov dl,xx,mov ah,2 int 21h 之中调用了 int 16h的哪些 地方,他是否用到了16号 中断,请大牛详解,还有程序该如何改正,研究一天了,
CSEG SEGMENT
ASSUME CS:CSEG
OLD16H DD ?
OLD1BH DD ?
NEW1 PROC FAR
NEW16H:
CMP AH,0
JZ PKEY0
CMP AH,1
JZ PKEY1
CMP AH,10H
JZ PKEY0
CMP AH,11H
JZ PKEY1
JMP DWORD PTR cs:OLD16H
PKEY0: PUSH AX
PKEY01:
POP AX
PUSH AX
PUSHF
CALL DWORD PTR cs:OLD16H
PKEY011: CMP AL,03H
JZ PKEY01
CMP AX,0300H
JZ PKEY01
ADD SP,2
IRET
PKEY1: PUSH AX
PKEY11:POP AX
PUSH AX
PUSHF
CALL DWORD PTR CS:OLD16H
JZ PKEY111
CMP AL,03H
JZ PKEY112
CMP AX,0300H
JNZ PKEY0115
PKEY112:
xor ah,ah
pushf
call dword ptr cs:OLD16H
jmp PKEY11
PKEY0115: CMP AX,0300H
PKEY111:ADD SP,2
IRET
NEW1 ENDP
NEW1BH:IRET
START:PUSH CS
POP DS
MOV AX,3516H
INT 21H
MOV WORD PTR OLD16H,BX
MOV WORD PTR OLD16H+2,ES
MOV AX,351BH
INT 21H
MOV WORD PTR OLD1BH,BX
MOV WORD PTR OLD1BH+2,ES
MOV DX,OFFSET NEW16H
MOV AX,2516H
INT 21H
MOV DX,OFFSET NEW1BH
MOV AX,251BH
INT 21H
S1:MOV AH,8
INT 21H
CMP AL,1BH
JZ EXIT
MOV DL,AL
MOV AH,2
INT 21H
CMP AL,0DH
JNZ S1
MOV AL,0AH
MOV DL,AL
MOV AH,2
INT 21H
JMP S1
EXIT:LDS DX,OLD16H
MOV AX,2516H
INT 21H
LDS DX,DS:OLD1BH
MOV AX,251BH
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
[解决办法]
dos 的键盘输入功能,不是通过 int16h 来实现的吧,所以在 int16h 里进行检测判断作相应的处理不会有预期效果;就如你上面的 int1bh 来处理 Ctrl+Break 似的,dos 是用 int23h 来处理 Ctrl_C 的。