assembly - 如何在装配中获得鼠标位置(TASM)
问题描述
我尝试在组件(TASM)中做一个计算器,为此我需要获取鼠标位置(位置)。我在另一个问题中看到有人写道水平位置(x)在 cx 中,垂直位置(y)在 dx 中,但是当我运行我的软件时,我看不到 2 个鼠标位置(在 cx 和 dx 中)之间的差异。有人知道为什么吗?还有另一个问题 - 我如何确定文本的位置?谢谢你
这是代码:
IDEAL
MODEL small
STACK 1000h
DATASEG
; --------------------------
; Your variables here
;black dw 0
color1 db 12
;1-blue ,2-green ,3-azure ,4-red ,5-pink ,6-orange ,7-white ,8-gray ,9-purple
filename db 'test.bmp',0
filehandle dw ?
Header db 54 dup (0)
Palette db 256*4 dup (0)
ScrLine db 320 dup (0)
ErrorMsg db 'Error', 13, 10,'$'
; --------------------------
CODESEG
proc OpenFile
; Open file
mov ah, 3Dh
xor al, al
mov dx, offset filename
int 21h
jc openerror
mov [filehandle], ax
ret
openerror:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
ret
endp OpenFile
proc ReadHeader
; Read BMP file header, 54 bytes
mov ah,3fh
mov bx, [filehandle]
mov cx,54
mov dx,offset Header
int 21h
ret
endp ReadHeader
proc ReadPalette
; Read BMP file color palette, 256 colors * 4 bytes (400h)
mov ah,3fh
mov cx,400h
mov dx,offset Palette
int 21h
ret
endp ReadPalette
proc CopyPal
; Copy the colors palette to the video memory registers
; The number of the first color should be sent to port 3C8h
; The palette is sent to port 3C9h
mov si,offset Palette
mov cx,256
mov dx,3C8h
mov al,0
; Copy starting color to port 3C8h
out dx,al
; Copy palette itself to port 3C9h
inc dx
PalLoop:
; Note: Colors in a BMP file are saved as BGR values rather than RGB.
mov al,[si+2] ; Get red value.
shr al,2 ; Max. is 255, but video palette maximal
; value is 63. Therefore dividing by 4.
out dx,al ; Send it.
mov al,[si+1] ; Get green value.
shr al,2
out dx,al ; Send it.
mov al,[si] ; Get blue value.
shr al,2
out dx,al ; Send it.
add si,4 ; Point to next color.
; (There is a null chr. after every color.)
loop PalLoop
ret
endp CopyPal
proc CopyBitmap
; BMP graphics are saved upside-down.
; Read the graphic line by line (200 lines in VGA format),
; displaying the lines from bottom to top.
mov ax, 0A000h
mov es, ax
mov cx,200
PrintBMPLoop:
push cx
; di = cx*320, point to the correct screen line
mov di,cx
shl cx,6
shl di,8
add di,cx
; Read one line
mov ah,3fh
mov cx,320
mov dx,offset ScrLine
int 21h
; Copy one line into video memory
cld ; Clear direction flag, for movsb
mov cx,320
mov si,offset ScrLine
rep movsb ; Copy line to the screen
;rep movsb is same as the following code:
;mov es:di, ds:si
;inc si
;inc di
;dec cx
;loop until cx=0
pop cx
loop PrintBMPLoop
ret
endp CopyBitmap
;----------------------------------------
start:
mov ax, @data
mov ds, ax
; --------------------------
; Your code here
; -----------------------
; Graphic mode
mov ax, 13h
int 10h
; Process BMP file
call OpenFile
call ReadHeader
call ReadPalette
call CopyPal
call CopyBitmap
;Show mouse
mov ax,1h
int 33h
;mov ax, 0003h
;int 33h
; Loop until mouse click
MouseLP:
mov ax,3h
int 33h
cmp bx, 01h ; check left mouse click
mov ax, 0003h
int 33h
jne MouseLP
; Press any key to continue
mov ah,00h
int 16h
; Text mode
mov ax,3h
int 10h
; return to text mode
;mov ah, 0
;mov al, 2
;int 10h
exit:
mov ax, 4c00h
int 21h
END start
解决方案
你永远不应该假设鼠标可用!在模拟器下通常不是。
谨慎的程序员首先检查中断向量 33h 是否指向某个地方,然后使用函数重置鼠标驱动程序AX=0000h
。
...
mov ax, 0000h ; reset mouse
int 33h ; -> AX BX
cmp ax, FFFFh
jne NoMouse
mov ax, 0001h ; show mouse
int 33h
MouseLP:
mov ax, 0003h ; get mouse position and buttonstatus
int 33h ; -> BX CX DX
test bx, 1 ; check left mouse click
jz MouseLP ; Loop until mouse click
...
在这里,您可以开始使用 和 的 X 和 YCX
位置DX
。
请注意:即使您在 320x200 屏幕上工作,鼠标坐标也会返回相对 640x200。您需要通过编写来调整 X 位置shr cx, 1
。
推荐阅读
- javascript - 未捕获的 ReferenceError:未定义 mongoDB.js
- graphql - 在 NextJS 中使用 Prisma 创建后如何重新获取数据?
- apache - 已安装 Oracle Autonomous Linux 7.9 Apache,但无法访问默认页面
- linux - 使用 dup2 的 Ubuntu Linux C 编程中的多个管道
- named-entity-recognition - 对于迁移学习的 spacy NER 模型上未见的自定义实体实例,召回率和 f1 分数非常低(~0.55 和 0.65)
- sql - SQL:使用 regexp_substr ot regexp_extract,寻找只返回一个字符和一个空格之间的字符串的正则表达式模式
- java - 找不到 apache poi 库
- javascript - 带有随机数据问题的时间序列的 Javascript 实时图表
- javascript - 为什么 input[type='tel'] 允许输入非数字字符?
- api - 如何使用 Blogger API 将我的帖子划分为不同的 FeedActivity?