assembly - 如何更改 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 中的前景色?
解决方案
鉴于您正在启动操作系统,屏幕很有可能处于文本视频模式。然后BL
ForegroundColor 参数不会有太大帮助,因为它仅在屏幕处于图形视频模式时才存在。
你可以做的是让像函数 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
推荐阅读
- c# - 为什么实例构造函数首先运行?
- r - R - 将 excel 读入源结构中的数据框并获取读取的行数
- prolog - 试图理解 Prolog 错误:existence_error
- c# - Parallel.For 运行 100 次然后停止?
- java - 如何避免每个线程创建不同的池?
- redis - AWS Elasticache redis 安全和限制
- xaml - 带有 CornerRadius 的框架不会变成圆形
- jsf - 如何在 JSF 复合组件中强制执行 cc:attribute 的类型?
- amazon-web-services - 使用 CLI 在 AWS 中描述策略
- ios - 是否可以在委托方法中使用完成处理程序 - Swift