首页 > 编程问答 >在使用鼠标和外设时遇到困难

在使用鼠标和外设时遇到困难

时间:2024-06-09 23:58:03浏览次数:27  
标签:assembly graphics mouse x86-16 tasm

我希望允许用户点击他选择的潜艇(这些潜艇已经定位:),然后他在屏幕上点击另一次,潜艇就会出现在那里。出于某种原因,无论我点击什么或在哪里,都会出现相同的潜水艇(4 号潜水艇),而且在我移动鼠标后,其中一些潜水艇会消失。此外,我还创建了一个循环,该循环应运行 5 次,但在一次迭代后,我的代码就继续前进了。

proc UseMouse
push ax ; 鼠标寄存器
推送 cx ;x 坐标(用于未来的潜水艇)
推入 dx ;y 坐标(用于未来的潜水艇)
按 bx
;mov ax,0h
;int 33h
;shr cx,1
等待左键点击:
;mov ax,1h
;int 33h
mov ax,3h
int 33h
cmp bx, 01h
je loop3
jmp wait_for_leftclick ; 这个开始循环肯定有效
loop3:
    
    Tnai1:
    mov ax,3h
    int 33h
    cmp bx, 01h
    jne 等待左键点击
    mov ah,0Dh
    输入 10h
    cmp al、4
    je Printsub1
    jmp Tnai2
    
    Tnai2:
    mov ax,3h
    int 33h
    cmp bx, 01h
    jne 等待左键点击
    mov ah,0Dh
    输入 10h
    cmp al, 5
    je printsub2
    jmp Tnai3
    
    Tnai3:
    mov ax,3h
    int 33h
    cmp bx, 01h
    jne 等待左键点击
    mov ah,0Dh
    输入 10h
    cmp al, 6
    jmp printsub3
    jmp printsub4
    
    Tnai4:
    mov ax,3h
    int 33h
    cmp bx, 01h
    jne 等待左键点击
    mov ah,0Dh
    输入 10h
    cmp al、7
    je Printsub4
    jmp Tnai5
    
    Tnai5:
    mov ax,3h
    int 33h
    cmp bx, 01h
    jne 等待左键点击
    mov ah,0Dh
    输入 10h
    cmp al、8
    je Printsub5
    jmp 完成

Printsub1:
SHR CX, 1
;mov ax,1h
;int 33h
wait_click1:
mov ax,3h
int 33h
cmp bx, 01h
jne wait_click1
收缩 cx,1
mov [Var1], cx
mov [Var2],dx
推 23
推 40
推 4
推[Var2]
推入 [Var1]
推送偏移潜艇1
调用 Sprite_Figure
jmp 完成


printsub2:
;shr cx, 1
;mov ax,1h
;int 33h
wait_click2:
mov ax,3h
int 33h
cmp bx, 01h
jne wait_click2
收缩 cx,1
mov [Var1], cx
mov [Var2],dx
推 23
推入 40
推 5
推[Var2]
推入 [Var1]
推送偏移潜艇2
调用 Sprite_Figure
jmp 完成

printsub3:
;shr cx, 1
;mov ax,1h
;int 33h
wait_click3:
mov ax,3h
int 33h
cmp bx, 01h
jne wait_click3
收缩 cx,1
mov [Var1], cx
mov [Var2],dx
推 23
推入 40
推 6
推[Var2]
推[Var1]
推送偏移潜艇3
调用 Sprite_Figure
jmp 完成

printsub4:
调用 setPixel
;shr cx, 1
;mov ax,1h
;int 33h
wait_click4:
mov ax,3h
int 33h
cmp bx, 01h
jne wait_click4 ;我们可以肯定这有效

shr cx,1
推入 23
推 40
推 7
推 dx
推 cx
推偏移潜艇4
调用 Sprite_Figure
jmp 完成


Printsub5:
;shr cx, 1
;mov ax,1h
;int 33h
wait_click5:
mov ax,3h
int 33h
cmp bx, 01h
jne wait_click5
收缩 cx,1
mov [var1], cx
MOV [VAR2],DX
推 23
推 40
推 8
推入 [Var2]
推[Var1]
推送偏移潜艇5
调用 Sprite_Figure
jmp 完成

完成:
弹出 bx
弹出 dx
弹出 cx
弹出 ax
返回
endp 使用鼠标

函数

mov ah, 5
timeX5:
dec ah
调用 UseMouse
cmp ah, 0
jne timeX5

我如何调用该函数

我试着在网上查找一些线索,并询问了一些朋友,但一无所获。在此先表示感谢:)


当然,我很乐意提供帮助!从提供的代码来看,我发现了一些可能会导致的潜艇问题和循环问题的问题。让我们来分解一下:

问题

  1. 始终绘制潜艇 #4: 问题在于的 Tnai 标签结构。有 jmp 指令,即使应绘制其他潜艇,它们也会直接进入 printsub4
  2. 循环迭代一次: 问题在于的 timeX5 函数。正在减少 ah 而不是递增,因此它永远不会满足 jne timeX5 条件。

解决方案

  1. 修复 Tnai 标签: 需要更正 Tnai 部分中的 jmp 指令,以跳至正确的位置。使用 je (如果相等则跳转)而不是 jmp (无条件跳转)。
  2. 修复 timeX5 循环: 应该在每次迭代后递增 ah ,以确保循环执行 5 次。

改进后的代码

proc UseMouse
push ax ; 鼠标寄存器
push cx ; x 坐标(用于未来的潜艇)
push dx ; y 坐标(用于未来的潜艇)
push bx

; 等待左键单击:
wait_for_leftclick:
mov ax, 3h
int 33h
cmp bx, 01h
jne wait_for_leftclick

; 获取单击位置的像素颜色
mov ah, 0Dh
int 10h

; 根据颜色决定绘制哪个潜艇
cmp al, 4
je Printsub1
cmp al, 5
je printsub2
cmp al, 6
je printsub3
cmp al, 7
je Printsub4
cmp al, 8
je Printsub5
jmp done ; 如果没有匹配的颜色,则不绘制任何内容

Printsub1:
shr cx, 1
; 等到单击以放置潜艇
wait_click1:
mov ax, 3h
int 33h
cmp bx, 01h
jne wait_click1
shr cx, 1
mov [Var1], cx
mov [Var2], dx
push 23
push 40
push 4
push [Var2]
push [Var1]
push offset submarine1
call Sprite_Figure
jmp done

printsub2:
; 等到单击以放置潜艇
wait_click2:
mov ax, 3h
int 33h
cmp bx, 01h
jne wait_click2
shr cx, 1
mov [Var1], cx
mov [Var2], dx
push 23
push 40
push 5
push [Var2]
push [Var1]
push offset submarine2
call Sprite_Figure
jmp done

printsub3:
; 等到单击以放置潜艇
wait_click3:
mov ax, 3h
int 33h
cmp bx, 01h
jne wait_click3
shr cx, 1
mov [Var1], cx
mov [Var2], dx
push 23
push 40
push 6
push [Var2]
push [Var1]
push offset submarine3
call Sprite_Figure
jmp done

printsub4:
; 等到单击以放置潜艇
wait_click4:
mov ax, 3h
int 33h
cmp bx, 01h
jne wait_click4
shr cx, 1
push 23
push 40
push 7
push dx
push cx
push offset submarine4
call Sprite_Figure
jmp done

Printsub5:
; 等到单击以放置潜艇
wait_click5:
mov ax, 3h
int 33h
cmp bx, 01h
jne wait_click5
shr cx, 1
mov [var1], cx
mov [VAR2], dx
push 23
push 40
push 8
push [Var2]
push [Var1]
push offset submarine5
call Sprite_Figure
jmp done

done:
pop bx
pop dx
pop cx
pop ax
ret
endp UseMouse

; 函数调用 UseMouse 5 次
mov cx, 5 ; 初始化循环计数器为 5
timeX5:
call UseMouse
loop timeX5 ; 递减 cx 并循环直到 cx 为 0

说明

  • 清晰的流程: 每个 Printsub 部分现在都明确地等待单击,然后再放置潜艇。
  • 简化的循环: timeX5 函数现在使用 loop 指令,这更清晰、更有效。
  • 更正后的条件跳转: Tnai 部分中的 jmp 指令已替换为 je ,以确保根据像素颜色选择正确的潜艇。

通过这些更改,的代码应该可以按预期工作,允许用户单击以选择一个潜艇,然后再次单击以将其放置在所需位置。循环也会按预期迭代 5 次。

如果需要有关此代码或有任何其他问题,请告诉我!

标签:assembly,graphics,mouse,x86-16,tasm
From: 78589479

相关文章

  • WPF button mouseover background change color
    <Applicationx:Class="WpfApp142.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-nam......
  • CorelDRAW 全称“CorelDRAW Graphics Suite
    箭头在各种场景中被广泛使用。在设计中,设计师可以根据设计的目的和受众,巧妙地运用箭头来传达信息、创造视觉效果或引导观者的注意力。在CDR软件中可以为设计添加箭头,那具体该怎么做呢?下面由我带大家一起来了解CoreIDRAW箭头形状工具在哪里,CoreIDRAW箭头形状怎么改成曲线的相关......
  • 如何在Slider中使用MouseLeftButtonDown事件
    MouseLeftButtonDown和MouseLeftButtonUp是两个经常同时使用的事件,最常用到的恐怕就是处理鼠标拖动,这种时候需要在Down事件中CaptureMouse,而在Up事件中Release。但是我在对一个继承Slider的控件这么做的时候却发现MouseLeftButtonUp事件可以正常触发,而MouseLeftButtonDown怎么也......
  • 控制台警告:[Violation] Added non-passive event listener to a scroll-blocking 'mou
    控制台警告:[Violation]Addednon-passiveeventlistenertoascroll-blocking'mousewheel'event.Considermarkingeventhandleras'passive'tomakethepagemoreresponsive.Seehttps://www.chromestatus.com/feature/5745543795965952[Viola......
  • WPF canvas mousewheel to zoom in or out
    <Windowx:Class="WpfApp133.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • linux 系统上图形生成错误 java.lang.NoClassDefFoundError: Could not initialize cl
    错误信息:02-Jun-202409:11:09.421SEVERE[Thread-32]org.apache.catalina.core.StandardWrapperValve.invokeServlet.service()forservlet[springDispatcherServlet]incontextwithpath[]threwexception[Handlerdispatchfailed;nestedexceptionisjava.lang.......
  • WebAssembly作为PLC(可编程逻辑控制器)引擎技术的10大优势
    WebAssembly(简称Wasm)是一种用于在现代Web浏览器中安全执行低级代码的二进制指令格式。它被设计为一种与语言无关的目标格式,这意味着可以用任何编程语言编写代码,然后编译成Wasm。将WebAssembly作为PLC(可编程逻辑控制器)IEC61131-3编程语言的的中间格式,可以带来一系列显著的优点,以下......
  • WebAssembly作为PLC(可编程逻辑控制器)引擎技术的10大优势
    WebAssembly(简称Wasm)是一种用于在现代Web浏览器中安全执行低级代码的二进制指令格式。它被设计为一种与语言无关的目标格式,这意味着可以用任何编程语言编写代码,然后编译成Wasm。将WebAssembly作为PLC(可编程逻辑控制器)的中间格式,可以带来一系列显著的优点,以下是一些主要的亮点:性......
  • mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版
    ShareMouse是一款跨平台的键盘和鼠标共享软件,它允许用户在多台计算机之间共享同一组键盘和鼠标,实现无缝的操作和控制。该软件适用于Windows和macOS系统,并且支持多种连接方式,包括局域网连接和无线连接。使用ShareMouse,用户可以轻松地在多台计算机之间切换和操作,而无......
  • WPF Image enlarge via MouseWheel, selected image center does not shift
    //xaml<Windowx:Class="WpfApp123.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......