2013-04-07 3 views
0

Я пытаюсь Переберите этот код, который записывает символ «Q» на адрес в сегменте B800 видеопамяти, указанный ES: [ди]Loops в Ассамблее: TASM на 8086 (DosBox)

здесь Я попытался увеличить цикл на два (поскольку каждая позиция экрана состоит из двух байтов, цвета и атрибута), но код создает только символ в первом месте. Я думаю, что я не понимаю, как использовать 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 наборов сх 0, но это бесполезно, так как вы mov cx,100 следующая строка

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

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

разл сх

JNZ даты

+0

спасибо, в этом есть смысл. У меня нет опыта в сборке, поэтому это действительно полезно. Если циклы требуют такого счетчика, то зачем тогда использовать инструкцию цикла? – user2241226

+0

феноменальный он отлично работает – user2241226

+0

Ну, хорошо, получайте удовольствие :-) Напоминает мне о тех днях, когда такие ошибки убивали всю машину. Но опять же, те, где времена, когда у ПК была настоящая кнопка сброса, и MS-DOS загружались быстрее с дискет, чем в настоящее время Windows с его твердотельного диска ;-) –

 Смежные вопросы

  • Нет связанных вопросов^_^