3

下面的代码让您可以用鼠标在屏幕上绘图,并且效果很好。我的问题是为什么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 
4

2 回答 2

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)。

在此处输入图像描述

于 2015-06-11T16:31:20.063 回答
1

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

DOSBox 截图 VirtualBox 下的 MS-DOS 6.22 截图

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

于 2015-06-11T19:34:25.497 回答