. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  看到键盘外中断的时候,自己模拟写了个模仿PDF阅读器中按下CTRL+就会放大的程序,按下CTRL一直按+就会变颜色  [待解决] 回复[ 2次 ]   点击[ 403次 ]  
wabc
[帖 主]   [ 发表时间:2013-02-05 10:30 ]   [引用]   [回复]   [ top ] 
荣誉值: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
wabc
[第1楼]   [ 回复时间:2013-02-05 10:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-11-15 10:27
这个做了2天,因为CTRL =是系统没定义的,所以要花费一番头脑
lazy
[第2楼]   [ 回复时间:2013-04-24 15:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-04-24 15:39
膜拜一下
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved