如何在汇编中反弹一个字符

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), 翻转向量,取消无效更新,做有效更新