Проблема с массивом и цветным текстом
Я хочу раскрасить некоторые буквы, используя этот процесс:
markText proc
mov ax,data
mov ds,ax
mov es,ax
mov cx, M
mov dx, 1
push dx
mov Counter, 0
mov si, 0
colorText:
mov ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR.
push ax
mov al,[CharMas+si]
cbw
mov bp, ax;STRING TO DISPLAY.
inc si
pop ax
mov bh,0 ;PAGE (ALWAYS ZERO).
mov bl,Color
mov L, cx
xor cx, cx
mov cx,1 ;STRING LENGTH.
mov dl,0 ;X (SCREEN COORDINATE).
mov dh,b.ColorRepeat ;Y (SCREEN COORDINATE).
int 10h ;BIOS SCREEN SERVICES.
mov cx, L
inc ColorRepeat
loop ColorText
mov AX,4C00h
int 21h
markText endp
В моем массиве (CharMas) у меня есть что-то вроде: "a", "b", "c". Но вместо цветных букв есть черный бланк. Что не так с моим кодом?
PS это прекрасно работает, если я изменяю индекс arr на 0 или 1, например:
mov bp, offset CharMas[0]
2 ответа
Функция BIOS "Запись символьной строки" требует указателя на выходную строку в ES:BP. Это именно то, что делает ваш "хороший" код:
mov bp, offset CharMas[0]
Тем не менее, ваш "плохой" код
mov al,[CharMas+si]
cbw
mov bp, ax
загружает 1 байт из строки в bp
, Для этого нужно поместить указатель на этот байт в bp
, Вы можете сделать это так:
mov bp, offset CharMas[0]; now bp is a pointer to the string
add bp, si; now bp is a pointer to a specific byte in the string
Или на самом деле вы можете использовать только одну инструкцию для этого:
lea bp, CharMas[si]; now bp is a pointer to a specific byte in the string
Вот lea
инструкция по эффективному адресу загрузки.
mov ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR.
Вы выбрали одну из более сложных функций BIOS для вывода ваших цветных символов. Кроме того, вы не используете параметры правильно!
К счастью, есть гораздо более удобная для пользователя функция, которую вы можете использовать.
mov si, OFFSET CharMas
mov cx, 1
mov bh, 0
mov bl, color
Again:
mov ah, 09h
lodsb ;Get next character from array
int 10h ;Outputs the colored character
mov ax, 0E0Ah ;0Ah=Linefeed
int 10h ;Advances the cursor to the next line
cmp byte ptr [si], 0
jne Again
CharMas db 'a','b','c',0