如何在程序集中弹出一个char

时间:2017-04-24 17:12:50

标签: assembly x86-16 emu8086

我需要一些帮助才能使用emu8086弹出屏幕上的角色。 屏幕尺寸为(80x25字符)。我设法将它对角地移动但它没有反弹。相反它在到达边界后直接在x轴上直行(即第24行)这是我到目前为止所做的。

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

1 个答案:

答案 0 :(得分:3)

您必须在代码中编写弹跳算法/逻辑。目前你的逻辑总是[+ 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),翻转向量,取消无效更新,并进行有效更新。