例8.11 在屏幕的右上角动态显示文本鼠标的位置,即:鼠标的任何移动都将马上显示其所处位置,按鼠标左键结束程序的运行。
| 解: | ||||
|  .MODEL SMALL, C .DATA OldAddr DD ? MSG LABEL BYTE  | 
  ||||
| XMSG DB 'X=' | ;显示方式:X=** Y=** | |||
|   XASC DW ? DB ' ' YMSG DB 'Y=' YASC DW ? Count EQU $-MSG .STACK 128 .CODE  |  
  ||||
| ClsScr | PROC | ;清除整个屏幕 | ||
| ClsScr | MOV | AX, 0600H | ||
| MOV | BH, 30H | |||
| MOV | CX, 0 | |||
| MOV | DX, 184FH | |||
| INT | 10H | |||
| RET | ||||
| ENDP | ||||
| ;把两位十进制数Data转换成字符串放入以首地址Desc开始的缓冲区之中 | ||||
| BTOAsc | PROC USES AX CX DI Data:WORD, Desc:PTR BYTE | |||
| BTOAsc | 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 | ||||
| ENDP | ||||
| ;把当前鼠标位置(CX,DX)显示在屏幕右上角,该子程序在本程序被设置为鼠标移动事 ;件的中断处理程序,所以,只要鼠标一移动,该子程序马上就被执行。  |  
  ||||
| DispPos | PROC FAR | |||
| DispPos | 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 | ||||
| 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 | ||||