Вам нужно будет вернуться к началу линии, потому что вам нужен разрыв линии. По своей природе прерывание строки перемещает курсор в начало следующей строки. При разрыве строк вам нужно пустое пространство и счетчик, чтобы отобразить пустое пространство n раз. Этот счетчик увеличивается с каждой отображаемой линией. Пример выполнен в EMU8086 (просто скопировать, вставить и запустить):
.STACK 100h
.DATA
text DB 'hello world',13,10,'$'
space DB ' $' ;BLANK SPACE.
spaces dw 1 ;COUNTER FOR BLANK SPACES.
.CODE
MOV AX,@DATA
MOV DS,AX
mov bx,10 ;HOW MANY LINES TO DISPLAY.
display_text:
mov cx, spaces
display_spaces:
mov ah, 9
mov dx, offset space
int 21h
loop display_spaces ;CX-1. IF CX!=0 : DISPLAY NEXT SPACE.
inc spaces ;MOVE NEXT INDENT ONE SPACE TO THE RIGHT.
;DISPLAY TEXT.
MOV AH,9
MOV DX,OFFSET text
INT 21h
dec bx ;LINES COUNTER.
mov cx, bx
loop display_text
MOV AH,4ch
INT 21h
Если вы хотите, чтобы увеличить отступ на один пробел, увеличиваем счетчик на 1, если вы хотите, чтобы отступы двумя пробелами, увеличение на 2, и так на.
Теперь без разрывов строк, с помощью GotoXY, таким образом, вам не нужно, чтобы вернуться к началу линии, потому что есть ни одна строка не сломается:
.STACK 100h
.DATA
text DB 'hello world',13,10,'$'
row db 1 ;LINE NUMBER.
col db 1
.CODE
MOV AX,@DATA
MOV DS,AX
mov cx,10 ;HOW MANY LINES TO DISPLAY.
display_text:
;GOTOXY.
mov ah, 2
mov bh, 0
mov dl, col
mov dh, row
int 10h ;BIOS SCREEN SERVICES.
;DISPLAY TEXT.
MOV AH,9
MOV DX,OFFSET text
INT 21h
inc row ;Y COORDINATE ONE LINE DOWN.
inc col ;X COORDINATE ONE COLUMN RIGHT.
loop display_text
MOV AH,4ch
INT 21h
попробовать BIOS INT 10h Fn 0Eh, но завершите строку с помощью 0 вместо «$» –
@ Функция телетайпа BIOS AlexjZhak 0Eh делает n ot зависит от любого разделителя. Он выводит единственный символ в регистре AL. – Fifoernik
@ user3819295 В DOS 6.2 ваша программа работает отлично. Вы работаете в системе на базе LINUX? Возможно, смена кода 10 (\ n) в 11 (\ v) может сработать для вас. – Fifoernik