【问题标题】:how to bounce a char in assembly如何在汇编中反弹一个字符
【发布时间】:2017-04-24 17:12:49
【问题描述】:

我需要一些帮助才能使用 emu8086 在我的屏幕上反弹一个字符。 屏幕尺寸为(80x25 字符)。我设法将它沿对角线移动,但它没有反弹。相反,它在到达边界(即第 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

【问题讨论】:

    标签: assembly x86-16 emu8086


    【解决方案1】:

    您必须在代码中编写弹跳算法/逻辑。目前,您的逻辑始终执行 [+1,+1] 并且在到达第 24 行后,它将开始对其执行额外的 [0,-1] (因此总变化为 (+1,+0)),然后在到达 79 列时,它会做额外的 [-1,0],所以总变化将是 (+0,+0)。

    即,您的代码执行您在那里编写的操作,代码没有问题。

    要修复您的逻辑,请先尝试用一些简单的语言编写算法(在 SO 询问时,英语会有所帮助),然后将其转换为更简单的步骤,直到它们类似于汇编指令,将其作为注释写在您的源代码中,然后用很少的指令来实现每条评论。

    首先,您可能需要“移动”向量,并将其添加到 [x1, y1],而不是:

        inc x1
        inc y1
    

    (即,mov al,[moveX] add [x1],al ...y 也是如此)。

    然后当到达边界时,否定移动向量的那部分,所以它会从 +1 翻转到 -1 并返回。如果您的起始位置在“内部”,则更新后检查边界是可以的(0 || 79 触发翻转),如果起始位置也可以在边界上,您应该尝试更新,检测无效位置(-1 || 80),翻转向量,取消无效更新,进行有效更新。

    【讨论】:

    • 角色现在正在弹跳,通过移动向量。弹回来的时候有个小问题,显示第24行最左列的字符,然后弹跳。
    • 已修复:我设法通过将“cmp al,24”更改为“cmp al,23”来解决问题(在评论中描述)。该程序现在运行良好。非常感谢您的帮助。
    • @MUHAMMADAHMEDVOHRA 大约 24/23 .. 是不是您使用 DOS 输出中断的问题,在使用最后一行时使屏幕“滚动”?考虑直接写入 VRAM(文本模式默认从 B800:0000 开始,除非您重新配置显卡内部结构),这会更快,而且它可以让您完全控制 VRAM 内容,因此您可以打印所有 256 个 VGA 字符并使用所有可能的颜色/闪烁组合。最后一行没有滚动(您必须通过代码手动滚动,通过移动 VRAM 内容或更改视频内存的开始)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2020-03-17
    • 2014-05-11
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多