Ваша текущая программа дает сбой, потому что вы ужасно смешиваете 2 системные функции, которые имеют один и тот же номер функции 02h, но ожидают получить совершенно разные данные в регистре DL
. Функция DOS OutputCharacter ожидает код символа, и вы устанавливаете его равным 48, но функция BIOS SetCursor будет интерпретировать то же значение 48, что и столбец. Именно поэтому результаты отображаются посередине экрана!
Поскольку вы говорите, что хотите начать с текущей позиции курсора, которая почти всегда будет на левом краю экрана при запуске программы, вообще нет необходимости устанавливать позицию курсора.
mov ah, 02h
mov dl, "0"
Next:
push dx ;Preserve current character
int 21h
mov dl, " " ;Your desired output shows this space?
int 21h
mov dl, 10 ;Linefeed moves the cursor 1 line down
int 21h
pop dx ;Restore current character
inc dl
cmp dl, "9"
jbe Next
Вместо того, чтобы использовать отдельный счетчик, вы можете принять решение о зацикливании, просмотрев значение в увеличенном регистре DL
.
Обратите внимание, что вы использовали инструкцию loop
, которая зависит от регистра CX
, но вы инициализировали только его нижнюю половину CL
! Это часто является причиной сбоя программы.
ИЗМЕНИТЬ
Учитывая, что DOSBox выдает как возврат каретки, так и перевод строки, когда его просят отобразить символ 10 (доведено до моего сведения в этот комментарий Майкла Петча), я написал следующую маленькую программу, которую проверил на точность в последней доступной версии DOSBox 0.74.
ORG 256 ;Create .COM program
mov ah, 02h ;DOS.DisplayCharacter
mov dx, "0" ;DH is spaces counter, DL is current character
jmps First ;Character "0" has no prepended spaces!
Next:
push dx ;(1)
mov dl, " "
Spaces:
int 21h
dec dh
jnz Spaces
pop dx ;(1)
First:
int 21h ;Display character in DL
push dx ;(2)
mov dl, 10 ;Only on DOSBox does this do Carriage return AND Linefeed !
int 21h
pop dx ;(2)
add dx, 0201h ;SIMD : DH+2 and DL+1
cmp dl, "9"
jbe Next
mov ax, 4C00h ;DOS.TerminateWithExitcode
int 21h
person
Sep Roland
schedule
26.11.2017