 | .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
| |