在程序集中使用鼠标在屏幕上绘图 (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 上时,你的程序只在显示器的左侧绘制像素。
您可能想向编写您的模拟器的人员提交错误报告。
下面的代码可以让你用鼠标在屏幕上绘图,而且效果很好。我的问题是为什么 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 上时,你的程序只在显示器的左侧绘制像素。
您可能想向编写您的模拟器的人员提交错误报告。