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

能否不调用中断使用屏幕页?寻求无中断操作视频缓冲区的底层方案

不用INT 10h中断切换屏幕页并直接操作视频缓冲区的方案

当然可以!完全不用依赖INT 10h中断就能切换显示页,甚至直接向视频缓冲区写入内容——这正是实模式下直接硬件访问的核心优势之一。下面我会拆解替代mov ax, 0501h; int 10h的底层实现,以及直接操作视频缓冲区的方法:

一、底层切换屏幕页(替代INT 10h功能05h)

在VGA文本模式(比如常见的80x25模式)下,屏幕页的切换是通过直接操作CRT控制器(CRTC)寄存器实现的,不需要调用任何中断:

原理

VGA的CRTC通过起始地址寄存器控制显示内存的起始偏移:

  • 每个80x25文本页的大小是80*25*2 = 4000字节(每个字符占2字节:ASCII码+属性)
  • 页1的起始偏移是4000h(相对于视频内存基地址B8000h)
  • CRT控制器的索引端口是3D4h,数据端口是3D5h

实现代码(汇编)

; 切换到屏幕页1,替代 mov ax, 0501h; int 10h
mov dx, 3D4h       ; CRT索引寄存器端口
mov al, 0Ch        ; 选择"起始地址高字节"寄存器
out dx, al
inc dx             ; 切换到CRTC数据端口3D5h
mov al, 40h        ; 页1起始偏移的高8位(4000h的高字节是40h)
out dx, al

dec dx             ; 回到索引端口3D4h
mov al, 0Dh        ; 选择"起始地址低字节"寄存器
out dx, al
inc dx             ; 切换到数据端口3D5h
mov al, 00h        ; 页1起始偏移的低8位(4000h的低字节是00h)
out dx, al

二、直接向视频缓冲区写入字符(无需中断)

切换到目标页后,直接操作对应页的视频内存即可输出内容:

  • 页0的视频内存基地址是B8000h
  • 页1的视频内存基地址是B8000h + 4000h = BC000h

示例:向页1的左上角写入字符'A'(黑底白字)

mov ax, 0BC00h     ; 页1的视频内存段地址
mov es, ax
xor di, di         ; 偏移地址0(对应屏幕左上角)

mov al, 'A'        ; 要显示的ASCII字符
mov ah, 07h        ; 属性:黑底白字(07h是默认文本属性)
stosw              ; 将AX写入ES:DI,自动推进DI

注意事项

  • 如果是EGA/CGA模式,CRTC端口可能是3B4h/3B5h,需要根据硬件调整
  • 不同文本模式的页大小可能不同(比如40x25模式每页是2000字节),计算偏移时要对应调整
  • 直接操作硬件寄存器时,要确保当前处于实模式(保护模式下需要额外处理I/O权限)

内容的提问来源于stack exchange,提问作者Ahmed Crow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:59:53