如何在汇编中反弹一个字符
how to bounce a char in assembly
我需要一些帮助才能使用 emu8086 在我的屏幕上弹跳一个角色。
屏幕大小为(80x25 字符)。我设法沿对角线移动它,但它没有反弹 back.Instead 它在到达边界(即第 24 行)后在 x 轴上直线移动这是我到目前为止所做的。
enter code here
Data_seg segment 'data'
char db 'A'
char2 db ' '
x1 db (1)
y1 db (1)
Data_seg ends
Code_seg segment 'code'
assume CS:Code_seg,DS:Data_seg
main PROC far
mov ax,Data_seg
mov ds,ax
mov cx,40
loop1:
;gotoxy
mov ah,02
mov dl,x1
mov dh,y1
mov bh,0
int 10H
;print a
mov al,char
mov dl,al
mov ah,02H
int 21H
;gotoxy
mov ah,02
mov dl,x1
mov dh,y1
mov bh,0
int 10H
;print " "
mov dl,char2
mov ah,02H
int 21H
inc x1
inc y1
;if(x1<2)||(x1>79)
mov al,x1
cmp al,2
jl ifPart
mov al,x1
cmp al,79
jge ifPart
;if(y1<2)||(y1>79)
y11:
mov al,y1
cmp al,2
jl ifPart2
mov al,y1
cmp al,24
jge ifPart2 ;jge for boundry(24)
jmp endif
ifPart:
dec x1
jmp y11
ifPart2:
dec y1
endif:
loop loop1
Code_seg ends
end main
您必须在代码中编写弹跳 algorithm/logic。目前你的逻辑总是做 [+1,+1] 并且在到达第 24 行之后它会开始对它做额外的 [0,-1] (所以总的变化是 (+1,+0)),然后在到达第 79 列时,它会做额外的 [-1,0],因此总变化将是 (+0,+0).
即,您的代码执行您在那里编写的内容,代码中没有问题。
要修复您的逻辑,请尝试先用一些通俗易懂的语言编写算法(在 SO 询问时,英语会有所帮助),然后将其转化为更简单的步骤,直到它们类似于汇编指令,然后将其作为注释写在您的源代码中, 并用很少的指令实现每条评论。
首先,您可能需要 "move" 向量,并将其添加到 [x1, y1],而不是:
inc x1
inc y1
(即 mov al,[moveX] add [x1],al
……y
也类似)。
然后当到达边界时,取反移动向量的那部分,所以它会从+1翻转到-1然后再翻转回来。如果你的起始位置是"inside",更新后检查边界是可以的(0 || 79触发翻转),如果起始位置也可以在边界上,你应该尝试更新,检测无效位置(-1 || 80), 翻转向量,取消无效更新,做有效更新
我需要一些帮助才能使用 emu8086 在我的屏幕上弹跳一个角色。 屏幕大小为(80x25 字符)。我设法沿对角线移动它,但它没有反弹 back.Instead 它在到达边界(即第 24 行)后在 x 轴上直线移动这是我到目前为止所做的。
enter code here
Data_seg segment 'data'
char db 'A'
char2 db ' '
x1 db (1)
y1 db (1)
Data_seg ends
Code_seg segment 'code'
assume CS:Code_seg,DS:Data_seg
main PROC far
mov ax,Data_seg
mov ds,ax
mov cx,40
loop1:
;gotoxy
mov ah,02
mov dl,x1
mov dh,y1
mov bh,0
int 10H
;print a
mov al,char
mov dl,al
mov ah,02H
int 21H
;gotoxy
mov ah,02
mov dl,x1
mov dh,y1
mov bh,0
int 10H
;print " "
mov dl,char2
mov ah,02H
int 21H
inc x1
inc y1
;if(x1<2)||(x1>79)
mov al,x1
cmp al,2
jl ifPart
mov al,x1
cmp al,79
jge ifPart
;if(y1<2)||(y1>79)
y11:
mov al,y1
cmp al,2
jl ifPart2
mov al,y1
cmp al,24
jge ifPart2 ;jge for boundry(24)
jmp endif
ifPart:
dec x1
jmp y11
ifPart2:
dec y1
endif:
loop loop1
Code_seg ends
end main
您必须在代码中编写弹跳 algorithm/logic。目前你的逻辑总是做 [+1,+1] 并且在到达第 24 行之后它会开始对它做额外的 [0,-1] (所以总的变化是 (+1,+0)),然后在到达第 79 列时,它会做额外的 [-1,0],因此总变化将是 (+0,+0).
即,您的代码执行您在那里编写的内容,代码中没有问题。
要修复您的逻辑,请尝试先用一些通俗易懂的语言编写算法(在 SO 询问时,英语会有所帮助),然后将其转化为更简单的步骤,直到它们类似于汇编指令,然后将其作为注释写在您的源代码中, 并用很少的指令实现每条评论。
首先,您可能需要 "move" 向量,并将其添加到 [x1, y1],而不是:
inc x1
inc y1
(即 mov al,[moveX] add [x1],al
……y
也类似)。
然后当到达边界时,取反移动向量的那部分,所以它会从+1翻转到-1然后再翻转回来。如果你的起始位置是"inside",更新后检查边界是可以的(0 || 79触发翻转),如果起始位置也可以在边界上,你应该尝试更新,检测无效位置(-1 || 80), 翻转向量,取消无效更新,做有效更新