Как сбросить символ в сборке

Мне нужна была помощь, чтобы отразить персонажа на экране с помощью emu8086. Размер экрана (80x25 символов). Мне удалось переместить его по диагонали, но он не отскакивает назад. Вместо этого он просто идет по осям х после достижения границы (то есть 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 ответ

Решение

Вы должны написать алгоритм / логику в коде. В данный момент ваша логика делает [+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 и обратно. Если ваша начальная позиция "внутри", проверка границ после обновления в порядке (0 || 79 вызывает переворот), если стартовая позиция может быть и на границе, вам лучше попробовать обновить, обнаружить недопустимую позицию (-1 || 80), переверните вектор, отмените недействительное обновление и выполните корректное обновление.

Другие вопросы по тегам