我希望允许用户点击他选择的潜艇(这些潜艇已经定位:),然后他在屏幕上点击另一次,潜艇就会出现在那里。出于某种原因,无论我点击什么或在哪里,都会出现相同的潜水艇(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
我如何调用该函数
?我试着在网上查找一些线索,并询问了一些朋友,但一无所获。在此先表示感谢:)
当然,我很乐意提供帮助!从提供的代码来看,我发现了一些可能会导致的潜艇问题和循环问题的问题。让我们来分解一下:
问题
-
始终绘制潜艇 #4:
问题在于的
Tnai
标签结构。有jmp
指令,即使应绘制其他潜艇,它们也会直接进入printsub4
。 -
循环迭代一次:
问题在于的
timeX5
函数。正在减少ah
而不是递增,因此它永远不会满足jne timeX5
条件。
解决方案
-
修复
Tnai
标签: 需要更正Tnai
部分中的jmp
指令,以跳至正确的位置。使用je
(如果相等则跳转)而不是jmp
(无条件跳转)。 -
修复
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