532628838
圣骑士
圣骑士
  • 注册日期2011-06-10
  • 发帖数98
  • QQ
  • 火币517枚
  • 粉丝77
  • 关注39
阅读:2578回复:0

鼠标中断实例学习

楼主#
更多 发布于:2011-08-01 16:38
.model small, c
.486
.stack 128
.data
 oldaddr dd ?
 msg label byte
 xmsg db ’x=’ ;显示方式:X=** Y=**  
 xasc dw ?
  db ’ ’
 ymsg db ’y=’
 yasc dw ?
 count equ $ - msg  
.code
 clsscr proc ;清除整个屏幕  
  mov ax, 0600h
  mov bh, 30h
  mov cx, 0
  mov dx, 184fh
  int 10h
  ret
 clsscr endp
 ;把两位十进制数Data转换成字符串放入以首地址Desc开始的缓冲区之中  
 btoasc proc uses ax cx di data:word, desc:ptr byte
  mov ax, data
  mov di, desc
  mov word ptr[di], 2020h ;赋两个空格  
  mov cl, 10
  div cl
  or al, 30h
  mov [di], al
  inc di
  or ah, 30h
  mov [di], ah
  ret
 btoasc endp
 ;把当前鼠标位置(CX,DX)显示在屏幕右上角,该子程序在本程序被设置为鼠标移动事
 ;件的中断处理程序,所以,只要鼠标一移动,该子程序马上就被执行。  
 disppos proc far
  shr cx, 3
  shr dx, 3
 invoke btoasc, cx, addr xasc
 invoke btoasc, dx, addr yasc
  mov ah, 02h
  mov bh, 0
  mov dx, 046h
  int 10h ;设置字符串的显示位置  
  mov ah, 40h
  mov bx, 01h
  mov cx, count
  lea dx, msg
  int 21h ;显示鼠标位置的字符串
  ret
 disppos endp
.startup
 call clsscr
 mov ax, 00
 int 33h ;鼠标复位及取状态
 .if ax != 00
  mov ax, 01h
  int 33h ;显示鼠标指针
  mov ax, cs
  mov es, ax
  lea dx, disppos
  mov ax, 14h
  mov cx, 1 ;把子程序DispPos设置成鼠标
  int 33h ;移动事件的中断服务程序
  mov word ptr oldaddr, dx
  mov word ptr oldaddr + 2, es ;保存原移动事件处理程序的入口地址
.repeat
   mov ax, 03h
   int 33h
  .until bx==1 ;按下鼠标左键
  mov ax, 02h
  int 33h ;隐藏鼠标指针
 .endif
 mov dx, word ptr oldaddr
 mov es, word ptr oldaddr + 2
 mov cx, 1
 mov ax, 0ch
 int 33h ;恢复原鼠标移动的中断服务程序  
 call clsscr
.exit 0
end


喜欢0 评分0
游客

返回顶部