Петли в сборке: TASM на 8086 (DosBox)

Я пытаюсь зациклить этот код, который записывает символ "Q" по адресу в сегменте видеопамяти b800, указанном в es:[di]

здесь я попытался увеличить цикл на два (поскольку каждая позиция экрана состоит из двух байтов, цвета и атрибута), но код создает символ только в первом месте. Я думаю, что я не понимаю, как использовать cx, потому что я думал, что это должно зацикливаться 100 раз.

.model small
.stack
.code
main:

sub cx, cx
mov cx, 100

dates:

mov ax,0B800h          
mov es,ax               
sub di, di               
mov di, 200
add di, 2 
mov ah, 5               
mov al, 'Q'              
mov es:[di], ax 

loop dates


mov ax,4C00h           
int 21h

end main

1 ответ

OMG, давно не занимался программированием на ассемблере, но есть некоторые очевидные ошибки:

  • начальный sub cx,cx устанавливает cx в 0, но это бесполезно, так как вы mov cx,100 следующая строка

  • Вы устанавливаете значения для esdi и т. д. новые для каждого цикла цикла, поэтому все итерации записываются в одно и то же место. Решение: перенести даты add di,2

  • у вас нет правильного счетчика циклов, поэтому вы должны заменить loop dates с чем-то вроде

декабрь

JNZ даты

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