Попытка переместить объект в сборке 8086 - PullRequest
1 голос
/ 17 апреля 2019

Я хочу переместить символ в строке (изначально строка = 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 Ответ

1 голос
/ 18 апреля 2019

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

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


lea dx, snake
mov ah, 2
int 21h

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

. Сохранение 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
...