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

时间:2015-06-11 15:04:24

标签: assembly mouse pixel 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 

2 个答案:

答案 0 :(得分:1)

EMU8086的下一个屏幕截图和您的代码将帮助我们了解正在发生的事情:

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

enter image description here

答案 1 :(得分:1)

您的模拟器(或其鼠标驱动程序)中发现了一个错误。当我在DOSBox和MS-DOS 6.22上运行程序时,在VirtualBox下直接在PC上运行,程序只在显示屏的左侧绘制像素。

DOSBox screenshot MS-DOS 6.22 under VirtualBox screenshot

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