Проблема с массивом и цветным текстом

Я хочу раскрасить некоторые буквы, используя этот процесс:

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
Другие вопросы по тегам