FASM汇编编写OS时BIOS视频服务过慢,如何实现几何图元绘制?
VGA 0x13模式下几何图元高性能绘制实现方案
核心优化原则
- 彻底抛弃所有
int 0x10绘图相关调用,所有绘制操作直接读写0xA0000段的显存,避免BIOS中断的上下文切换开销,速度能提升10~100倍。 - 内核初始化阶段就将
ES段寄存器固定指向0xA000,后续所有显存操作都通过ES段访问,无需每次修改段寄存器,降低额外开销:
; 内核初始化进入0x13模式后执行一次即可 mov ax, 0xA000 mov es, ax
各几何图元实现思路
1. 优化基础像素写入函数
修改现有__putpix实现,去掉段切换逻辑,用移位替代乘法运算提升速度,适配16位实模式运行环境:
; 输入:al=颜色, cx=x, dx=y __putpix: push bx push dx ; 计算偏移 = y*320 + x = y*256 + y*64 +x mov bx, dx shl bx, 6 ; y*64 shl dx, 8 ; y*256 add bx, dx add bx, cx mov byte [es:bx], al pop dx pop bx ret
2. 矩形填充优化
直接使用rep stosb批量写入单行像素,比逐点循环效率高数倍:
; 输入:al=颜色, cx=x, dx=y, si=宽度, di=高度 __fill_rect: push ax push bx push cx push dx push di ; 计算起始偏移 mov bx, dx shl bx, 6 shl dx, 8 add bx, dx add bx, cx .row_loop: mov cx, si ; 单行像素数 mov di, bx rep stosb ; 批量写入整行 add bx, 320 ; 跳到下一行起始位置 dec di jnz .row_loop pop di pop dx pop cx pop bx pop ax ret
3. 线段绘制
使用Bresenham直线算法,全整数运算,无浮点开销:
- 区分斜率绝对值大于1和小于1两种场景,步进方向取长轴
- 全程只用加减、移位、比较运算,单条线段绘制耗时在微秒级
4. 圆形绘制
使用中点圆算法,利用圆形的八对称性降低运算量:
- 仅需计算1/8圆弧的坐标,其余7个点通过坐标镜像直接获得
- 同样采用全整数运算,无需开方等耗时操作
现有代码问题修复
- 删除
__pixel、__zone2等调用BIOS中断的函数,所有绘制宏全部替换为直接写显存的实现 - 修复
rect宏的参数传递逻辑:当前宏实现中si和di传入的是坐标最大值,和__rect函数的参数预期匹配,建议统一改为传入宽度和高度,避免边界计算错误
内容的提问来源于stack exchange,提问作者Våñø Čhêt
相关产品推荐
相关产品推荐

