1. 文本模式下的自定义图形显示原理
在DOS时代的文本模式下,屏幕通常被划分为80列×25行的字符网格。每个字符位置由两个字节表示:一个字节存储ASCII码,另一个字节存储属性(颜色、闪烁等)。标准的文本模式使用ROM中的字符发生器(Character Generator)来定义每个字符的点阵图案。
但你可能注意到,像Norton Utilities这样的经典工具能在文本模式下显示精美的边框、图标甚至简单图形。这实际上是通过重定义字符集实现的——将某些不常用字符(如制表符、扩展ASCII字符)的点阵数据替换为自定义图案。当程序显示这些字符时,屏幕上呈现的就是我们设计的图形。
技术细节:在VGA硬件中,字符发生器实际上是一个8×16像素的位图数组。每个字符占用16字节(每垂直行1字节,每字节8位对应8个水平像素)。通过修改这些数据,我们就能"伪造"出任意图案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BIOS中断10H的字符重定义功能
2.1 INT 10H功能11H详解
BIOS的INT 10H中断是显示服务的核心接口,其中功能11H专门用于字符集操作。关键参数组合如下:
assembly复制; 基本调用格式
MOV AX, 1100h ; AH=11H(功能号), AL=00H(用户自定义模式)
MOV BX, 1000h ; BH=10H(每字符16字节), BL=00H(块选择)
MOV CX, 2 ; 要重定义的字符数量
MOV DX, 00CEh ; 起始字符编码(这里选择CEH和CFH)
MOV ES, SEGMENT ; 字符数据段地址
MOV BP, OFFSET ; 字符数据偏移量
INT 10h
参数解析:
- AL子功能:
- 00H/10H:加载用户自定义字模到指定块
- 03H:设置活动字符块(用于切换不同字符集)
- BH:每个字符的字节数。对于标准VGA 8×16字体应设为16(10H)
- BL:目标字符块(通常0-3对应不同存储区域)
- CX:连续重定义的字符数量
- DX:起始字符的ASCII码
- ES:BP:指向自定义字模数据的指针
2.2 字符数据格式规范
每个自定义字符需要16字节的位图数据,每字
