Попытка переместить объект в сборке 8086

#animation #assembly #x86-16

#Анимация #сборка #x86-16

Вопрос:

Я хочу переместить символ в строке (изначально строка = 0), и если строка равна 50, она остановится. Но он работает не так, как ожидалось.
Возможно, это не работает из-за lea dx и того факта, что значение строки находится внутри dl .

 dosseg
.model small
.stack 100h

.data
    snake db ">$"
.code

main proc

     mov ax, @data
     mov ds, ax

     mov ah, 06h
     mov al, 0
     mov ch, 0
     mov cl, 0
     mov dh, 24
     mov dl, 79
     mov bh, 00001100b

     int 10h
     mov dl, 5

    lb1:
         mov ah, 02h
         mov bh, 0
         mov dh, 5


         int 10h
         inc dl

         lea dx, snake
         mov ah, 2
         int 21h

        cmp dl, 50

  jbe lb1

     mov ah, 4ch
     int 21h

main endp
end main

 

Комментарии:

1. lea dx, snake <— Вы понимаете, что вы перезаписываете значение dl here ? Кроме того, int 21h / ah=2 печатается один символ, значение которого находится в dl . Возможно, вы имели в виду использовать int 21h / ah=9 ?

2. Спасибо @Michael за воспроизведение, я внес некоторые изменения, и, по крайней мере, это работает. но я внес некоторые изменения в свой вопрос, пожалуйста, взгляните на это. извините, что отнял у вас время, я новичок в сборке

3. @michael IMAGE я хочу переместить -> на экран, но он меняет его положение и перемещается, но добавляет 25 раз. я только хочу переместить —>

4. Затем вам нужно написать пробел ( ' ' ) в старой позиции.

5. новичок в этом, не могли бы вы рассказать мне, как или в каком-либо блоге или ссылке?

Ответ №1:

я хочу переместить символ в строке [начальная строка = 0], и если строка равна [строка = 50], она остановится

Вы знаете, что ваша программа изменяет столбец вместо строки?


 lea dx, snake
mov ah, 2
int 21h
 

Тот факт, что приведенный выше код уничтожает ваш столбец, DL может быть исправлен 2 способами:

. Сохранить DL в стеке

 push dx
lea  dx, snake
mov  ah, 09h
int  21h
pop  dx
 

. Не уничтожайте DL , используя другую функцию вывода

 mov  cx, 1
mov  bh, 0
mov  al, '>'
mov  ah, 0Ah
int  10h
 

Чтобы получить ощущение перемещения, вам нужно убрать объект на его старое место:

 lb1:
 mov  cx, 1
 mov  bh, 0
 mov  al, ' '   ;Remove at old place
 mov  ah, 0Ah
 int  10h

 inc  dl        ;Goto to new place (next column)
 mov  dh, 5     ;Row 5, Column in DL
 mov  bh, 0
 mov  ah, 02h
 int  10h

 mov  cx, 1
 mov  bh, 0
 mov  al, '>'   ;Show at new place
 mov  ah, 0Ah
 int  10h

 cmp  dl, 50
 jbe  lb1
 

Поскольку все будет происходить так быстро, вы на самом деле не увидите движение! После показа объекта вам потребуется пауза.

В качестве быстрой альтернативы я буду использовать ожидание нажатия клавиши:

 lb1:
 mov  cx, 1
 mov  bh, 0
 mov  al, ' '   ;Remove at old place
 mov  ah, 0Ah
 int  10h

 inc  dl        ;Goto to new place (next column)
 mov  dh, 5     ;Row 5, Column in DL
 mov  bh, 0
 mov  ah, 02h
 int  10h

 mov  cx, 1
 mov  bh, 0
 mov  al, '>'   ;Show at new place
 mov  ah, 0Ah
 int  10h

 mov  ah, 00h   ;Wait for a keystroke.
 int  16h

 cmp  dl, 50
 jbe  lb1