首页 > 解决方案 > 如何更改 Assembly 中的前景色?

问题描述

我在组装中制作了一个操作系统。现在,我想更改 Assembly 中的前景色。但我不知道怎么做。

这是我的代码:

    BITS  16
    ORG 7C00h

start:
    cld
    xor ax, ax
    mov ds, ax
    mov ss, ax
    mov sp, 7C00h

    call print_string
    db 'OS', 0
    jmp $

print_string:
    pop si
    mov bx, 7
    mov ah, 0Eh

.repeat:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .repeat

.done:
    jmp si


    times 510-($-$$) db 0
    dw 0xAA55

生成文件:

DIR=build build
$(shell mkdir -p $(DIR))
$(shell nasm -f bin OS1.asm -o build/OS1.img)

如何更改 Assembly 中的前景色?

标签: assemblynasmx86-16bootloaderbios

解决方案


鉴于您正在启动操作系统,屏幕很有可能处于文本视频模式。然后BLForegroundColor 参数不会有太大帮助,因为它仅在屏幕处于图形视频模式时才存在。

你可以做的是让像函数 09h 这样的属性感知输出函数在 Teletype 函数 0Eh 之前。您使用第一个函数输出彩色字符,第二个函数作为一种方便的方式来推进光标(第一个函数不这样做!)。
作为安全措施,低于 32 的 ASCII 码,包括特殊字符,如 7、9、10 和 13(Beep、Tab、Linefeed 和 CarriageReturn),不会发送到函数 09h,因为它们不是真正的字符,是吗?

属性字节允许您指定前景色和背景色。低 4 位编码前景色 (FGC),高 4 位编码背景色 (BGC)。

                         BGC  FGC
LightRedOnBlack:  0Ch == 0000_1100b   ; 0 is black and 12 is light red
BrighWhiteOnBlue: 1Fh == 0001_1111b   ; 1 is blue and 15 is bright white
...
print_string:
    pop si
    mov cx, 1      ; RepetitionCount=1
    mov bx, 000Ch  ; DisplayPage=0, Attribute=12 (LightRedOnBlack)
.repeat:
    lodsb
    cmp al, 0
    je  .done
    cmp al, 32
    jb  .skip
    mov ah, 09h    ; BIOS.WriteCharacterAndAttribute
    int 10h
.skip:
    mov ah, 0Eh    ; BIOS.Teletype
    int 10h
    jmp .repeat
.done:
    jmp si

推荐阅读