如何清除BIOS屏幕信息后正常打印消息,解决文本拉伸问题
问题根源
你现有代码的核心错误是误调用了int 10h的设置显示模式功能:
- 当你执行
xor ax, ax后AH=0,触发int 10h的0号功能,用于切换显示模式 - 此时
AL=0对应40×25低分辨率文本模式,比常用的80×25模式每行字符数少一半,所以会出现字符横向拉伸的问题 - 代码中对BX寄存器的两次赋值属于冗余操作,对清屏逻辑没有任何作用
正确清屏实现方案
方案1:使用int 10h 07h中断清屏
这是BIOS原生支持的清屏方案,参数设置如下:
; 配置清屏参数 mov ah, 07h ; 功能号:窗口向上滚动 mov al, 0 ; 滚动行数:0表示清空整个窗口 mov bh, 07h ; 空白区域属性:黑底白字 mov ch, 0 ; 窗口左上角行号 mov cl, 0 ; 窗口左上角列号 mov dh, 24 ; 窗口右下角行号(80×25模式下最大行号为24) mov dl, 79 ; 窗口右下角列号(80×25模式下最大列号为79) int 10h ; 调用BIOS中断执行清屏
方案2:直接写VGA文本显存清屏
这种方案无需调用BIOS中断,执行速度更快,适合bootloader场景:
vram_seg equ 0xb800 ; VGA文本模式显存段地址 mov ax, vram_seg mov es, ax ; 设置ES段寄存器指向显存 xor di, di ; 显存偏移从0开始 mov cx, 80*25 ; 总字符数:80列×25行 mov ax, 0x0720 ; 每个字符单元内容:07为黑底白字属性,20为空格ASCII码 rep stosw ; 批量写入显存完成清屏
使用该方案不会修改当前显示模式,不会出现字符拉伸问题。
内容的提问来源于stack exchange,提问作者ronalddd
相关产品推荐
相关产品推荐

