在程序集中使用鼠标在屏幕上绘图 (emu8086)

Draw on screen using mouse in assembly (emu8086)

下面的代码可以让你用鼠标在屏幕上绘图,而且效果很好。我的问题是为什么 CX 需要除以 2?为什么一开始就翻倍了?

code segment
main proc far

mov al, 12h
mov ah, 0   ; set graphics video mode.
int 10h   

mov ax, 1   ;shows mouse cursor
int 33h

Next:
mov ax, 3   ;get cursor positon in cx,dx
int 33h

call putpix ;call procedure 
jmp Next

mov ah,4ch
int 21h
main endp

;procedure to print
putpix proc   
mov al, 7   ;color of pixel  
mov ah, 0ch    
shr cx,1    ; cx will get double so we divide it by two
int 10h     ; set pixel.
ret
putpix endp
code ends 

EMU8086 的下一张截图和您的代码将帮助我们了解发生了什么:

  • 紫色箭头显示视频模式 12h,即 640x480。
  • 蓝色箭头表示代码在CX,DX中获取光标位置时光标所在的位置。是右下角,我特意做的,取最大值
  • 我添加了一个 "readkey" 代码片段来停止此时的执行并查看 CX 和 DX 的值(黄色条)。
  • 红色箭头显示 CX 和 DX 的值。 DX为01DB = 475,在0..479范围内。但是 CX 是 04FA = 1274(绿色箭头),这是不可能的,因为视频模式允许列在 0..639.
  • 范围内
  • 结论很简单:鼠标中断 33h returns 光标列的值加倍。解决这个问题的方法是将列除以 2 (shr cx,1).

您的模拟器(或其鼠标驱动程序)似乎遇到了错误。当我 运行 你的程序在 DOSBox 和 MS-DOS 6.22 运行 下同时在 VirtualBox 下和直接在 PC 上时,你的程序只在显示器的左侧绘制像素。

您可能想向编写您的模拟器的人员提交错误报告。