Assembly 如何在部件中获取鼠标位置(TASM)

Assembly 如何在部件中获取鼠标位置(TASM),assembly,x86-16,tasm,Assembly,X86 16,Tasm,我尝试在汇编中使用计算器(TASM),为此我需要获得鼠标位置(位置)。在另一个问题中,我看到有人写道,水平位置(x)在cx中,垂直位置(y)在dx中,但当我运行软件时,我看不到两个鼠标位置(cx和dx)之间的差异。 有人知道为什么吗? 还有一个问题-我如何确定文本的位置? 多谢各位 代码如下: IDEAL MODEL small STACK 1000h DATASEG ; -------------------------- ; Your variables here ;black dw 0

我尝试在汇编中使用计算器(TASM),为此我需要获得鼠标位置(位置)。在另一个问题中,我看到有人写道,水平位置(x)在cx中,垂直位置(y)在dx中,但当我运行软件时,我看不到两个鼠标位置(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
  ...
在这里,您可以从
CX
DX
开始使用X和Y位置


注意:即使您在320x200屏幕上工作,鼠标坐标也会返回相对640x200。您需要通过编写
shr-cx,1

来调整X位置问题:(1)您是在DOS中运行还是在DOS模拟器中运行?你还没说。(2) 您所说的正在检查
cx
dx
的鼠标代码在哪里?若要定位文本,假设您使用的是DOS或模拟,请使用。这方面的文档都是在线的。我以为这就是代码:(mov ax,0003h int 33h)我错了吗?如果我错了-代码是什么?我使用dosbox 0.74查找。具体来说,该命令查询鼠标位置和按钮。你说的定位文本(设置文本光标位置)完全不同。如果我理解正确,我想我需要的是鼠标位置,而不是定位文本。我需要找出鼠标是否被点击,以及任何数字的位置,因为我需要知道用户想要点击哪个按钮。在这段代码中,我读到鼠标的位置应该在cx和dx中,但它不存在。我写了这个,然后我得到了cx和dx中的位置?