You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:27:04