first db 0 dup(9)
last db 0 dup(9)
Замечание "... данные автоматически копируются в массив 'last', даже если не было никакого кода, который велел бы программе сделать это". правильно, потому что вы фактически поместили обе метки first и last в одном месте.
При использовании оператора dup
для получения нескольких копийдля некоторого значения вы должны указать число перед оператором dup
и значения, которые должны повторяться в скобках.
first db 9 dup (0)
last db 9 dup (0)
Это приводит к следующему результату, который оставляеткомната для 9 входных байтов:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
^ ^
first
last
При счете 2 вы получите:
0, 0, 0, 0
^ ^
first
last
При счете 1 вы получите:
0, 0
^ ^
first
last
Но с ошибочным 0 в качестве числа вы получили:
?
^
first
last
и, следовательно, запись в first[bx]
также пишет в last[bx]
.
Вы не хотитеввода больше, чем может загрузить буфер!
Loop1:
...
jmp Loop1
Ваш текущий код представляет собой бесконечный цикл.
Учитывая, что во входном буфере есть место для 9 байтов, вам нужно ограничитьколичество итераций к этому много. Используйте переменную-счетчик, такую как mov cx, 9
, которую вы уменьшаете с каждой итерацией, и когда она достигает 0, вы останавливаете цикл.
mov cx, 9
Loop1:
mov ah, 01h
int 21h
mov bl, i
mov bh, 0
mov first[bx], al
add i, 1
dec cx
jnz Loop1
Оптимизированный способ сделать это объединяет счетчик и адрес смещения в одномрегистр. У вас есть выбор между BX
, SI
и DI
. Там также BP
, но тогда вам придется возиться с сегментными регистрами. Не знаю, готовы ли вы к этому!
xor bx, bx
Loop1:
mov ah, 01h
int 21h
mov first[bx], al
inc bx
cmp bx, 9
jb Loop1
Как видите, не было никакой реальной необходимости использовать основанную на памяти переменную индекса i .