|
主题 : : 看到键盘外中断的时候,自己模拟写了个模仿PDF阅读器中按下CTRL+就会放大的程序,按下CTRL一直按+就会变颜色 [待解决] |
回复[ 2次 ]
点击[ 403次 ] | |
荣誉值:0
信誉值:0
注册日期:2012-11-15 10:27 |
;系统没有定义的组合键,中断例程是按下CTRL +,和PDF那个一样
data segment
dw 0,0 ;input data segment code here
num1 db 16(0)
num2 db 128(0)
data ends
stack segment
db 128 dup(0) ;input stack segment code here
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,stack
mov ss,ax
mov sp,128
;设置堆栈
mov ax,data
mov ds,ax
mov ax,0
mov es,ax
push es:[9*4]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
;保存原始的向量表的地址在数据段
cli;锁定防止错误的CS:IP
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
sti
;设置新的中断入口地址
mov ax,0b800h
mov es,ax
mov ah,'a'
IN AL,21H
AND AL,11111101B
OUT 21H,AL ;确保中断屏蔽寄存器没有屏蔽键盘中断
STI
s: mov es:[160*12+80],ah
call dis
inc ah
cmp ah,'z'
jna s
;触发中断的程序
mov ax,0
mov es,ax
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
;恢复原始的入口
mov ah,4ch
int 21h
dis proc;空循环
push ax
push dx
mov dx,1300h
mov ax,0
s1:sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
dis endp
;下面为新的INT9的中断例程
int9:
push ax
push bx
push ds
push dx
push cx
in al,60h
mov num2,al;把每一次中断的端口的值都保存起来判断
cmp num2,9dh;判断1:如果NUM2=9DH(CTRL松开),那么把NUM1清0,NUM2清0,返回
jne d1
mov num1,0
mov num2,0
jmp exit
d1:cmp num2,1dh;判断2:如果NUM2=1DH(CTRL按下),就把1DH放在NUM1,返回
jne d2
mov num1,1dh
jmp exit
d2:cmp num2,0dh;判断3:如果NUM2=0DH(=按下),检查NUM1是不是1DH,是就执行动作,不是就返回
jne exit
cmp num1,1dh
jne exit
d3:
;如果想要2个键按一次就消失,下一次要这个动作还要按这两个键,只要在这里加一个 mov num1,0 清0就行,不能加INC后面,因为DS变了
mov ax,0b800h;动作
mov ds,ax
mov bx,0
inc byte ptr es:[160*12+81]
exit:
MOV AL,20H
OUT 20H,AL;如果没这个命令就不会响应其他中断了
pop cx
POP DX
POP ds
pop bx
pop ax
IRET
code ends
end start | | |