作为初步建议,始终设置引导加载程序所依赖的段寄存器。在这里,由于使用了
lodsb
和
[ORG 0x7C00]
,您必须设置
DS=0
。
最好确保方向标志 DF 处于已知状态。简单的
cld
即可。
回答您的问题。您使用的 BIOS.Teletype 函数 0Eh 可以产生所需的红色
但仅在图形视频模式下。因此,下一个解决方案将起作用:
[BITS 16]
[ORG 7C00h]
jmp main
...
main:
xor ax, ax
mov ds, ax
cld
mov ax, 0012h
int 10h
mov si, string
mov bl, 4
call printstr
jmp $
printstr:
mov bh, 0
print:
lodsb
cmp al, 0
je done
mov ah, 0Eh
int 10h
jmp print
done:
ret
string db "HELLO WORLD!",13,10,0
times 510 - ($-$$) db 0
dw 0AA55h
如果您希望使用文本视频模式,则BIOS.WriteCharacterWithAttribute函数09h是正确的选择。
请注意,参数不同。BL现在保存属性字节,指定同时显示2种颜色(前景色在低四位中,背景色在高四位中),另一个参数使用CX寄存器。
另一点是这个函数将为每个ASCII码显示一个有颜色的字符。因此回车符(13)和换行符(10)将无法正确解释,除非您采取措施。
然而,最重要的事实是该函数不会推进光标。幸运的是,有一个不错的技巧。只需依次调用两个函数09h和0Eh即可...
示例:
[BITS 16]
[ORG 7C00h]
jmp main
...
main:
xor ax, ax
mov ds, ax
cld
mov ax, 0003h
int 10h
mov si, string
mov bl, 04h
call printstr
jmp $
printstr:
mov cx, 1
mov bh, 0
print:
lodsb
cmp al, 0
je done
cmp al, 32
jb skip
mov ah, 09h
int 10h
skip:
mov ah, 0Eh
int 10h
jmp print
done:
ret
string db "HELLO WORLD!",13,10,0
times 510 - ($-$$) db 0
dw 0AA55h
B800h
,它由字符:属性字节对组成。在这种情况下,这个SO问题可能会有所帮助。'attr'设置了文本颜色前景和背景。 - zx485