Как сбросить символ в сборке
Мне нужна была помощь, чтобы отразить персонажа на экране с помощью 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), переверните вектор, отмените недействительное обновление и выполните корректное обновление.