Вы неправильно используете функции прерывания:
INT 10h, AH=09h
печатает несколько одинаковых символов одновременно. Счет передается в регистр CX
. Чтобы напечатать строку, вы должны вызывать ее так часто, как символы в строке, с другими установленными параметрами. Символ должен быть передан в регистр AL
, а атрибут / цвет должен быть передан в регистр BL
. BH
должно (вероятно) остаться 0
, а CX
должно остаться 1
. DL
и DH
не используются этой функцией, поэтому вы можете удалить соответствующие команды.
Исходную позицию курсора можно установить с помощью функции INT 10h, AH=02h
. Убедитесь, что значение BH
соответствует значению в приведенном выше коде (0
).
Итак, ваш код может выглядеть так:
; ...
; Print character of message
; Make sure that your data segment DS is properly set
MOV SI, offset Msg
mov DI, 0 ; Initial column position
lop:
; Set cursor position
MOV AH, 02h
MOV BH, 00h ; Set page number
MOV DX, DI ; COLUMN number in low BYTE
MOV DH, 0 ; ROW number in high BYTE
INT 10h
LODSB ; load current character from DS:SI to AL and increment SI
CMP AL, '$' ; Is string-end reached?
JE fin ; If yes, continue
; Print current char
MOV AH,09H
MOV BH, 0 ; Set page number
MOV BL, 4 ; Color (RED)
MOV CX, 1 ; Character count
INT 10h
INC DI ; Increase column position
jmp lop
fin:
; ...
Функция DOS INT 21h
, которая печатает строку до конца-символа $
, не заботится о атрибуте, переданном в функцию BIOS INT 10h
, поэтому цвет игнорируется, и вы можете удалить соответствующий код от ;print the string
до INT 21h
.