如何清除屏幕上的 BIOS 相关信息然后打印信息?

Posted

技术标签:

【中文标题】如何清除屏幕上的 BIOS 相关信息然后打印信息?【英文标题】:How to clear BIOS-related info on screen then print message? 【发布时间】:2021-12-20 18:34:36 【问题描述】:

大家!我正在提高我的组装低级技能,并使自己成为一个简单的引导加载程序。我现在做了一些例程和入口点并成功输出了一条消息,但是我想清除屏幕,所以在输出我的消息时,它会很干净。我尝试制作一个清除AX 寄存器的例程,将地址0xb800 的内容存储到BX,然后复制或MOVing AX 寄存器的内容。 像这样:

vram equ 0xb800

xor ax, ax
mov bx, [vram]
mov bx, ax
int 10h

它成功清除屏幕但我有一个问题,如图所示,它拉伸了文本。


然后我搜索了一些答案。我没有找到一些答案,因为搜索结果只是给我 DOS 中断以清除屏幕。

但是,我确实尝试过使用INT 10, AH=07h,但我不知道如何使用它。

请帮帮我,谢谢! :D

【问题讨论】:

【参考方案1】:

文本被“拉伸”了,因为您设置了一个 40 列的屏幕!你写过:

xor ax, ax    <<<< This is video mode 0, so 40x25 16-color text
int 10h

使用

mov  0003h
int  10h

设置 80x25 16 色文本屏幕。


vram equ 0xb800

xor ax, ax
mov bx, [vram]
mov bx, ax
int 10h

在上面的代码中,您似乎混合了两种清除屏幕的方法。

设置视频模式

Bios 提供了多种视频模式。有些是文本模式,有些是图形模式。在图形模式下,您可以处理每个像素,而在文本模式下,您可以处理彩色字符。当然,在图形模式下也可以输出彩色字符。 这是更相关模式的列表:

01h 40x25 16-color text          25 rows, 40 columns -> wide characters!
03h 80x25 16-color text          25 rows, 80 columns
07h 80x25 monochrome text        25 rows, 80 columns
10h 640x350 16-color graphics    25 rows, 80 columns
12h 640x480 16-color graphics    30 rows, 80 columns
13h 320x200 256-color graphics   25 rows, 40 columns -> wide characters!

手动清除显存

您的等式vram equ 0xb800 表示内存中regen 缓冲区所在的段。值 0xB800 需要加载到段寄存器中。下一个代码将清除(第一页)80x25 文本屏幕:

mov  ax, vram
mov  es, ax
xor  di, di
mov  cx, 80 * 25
mov  ax, 0720h      ; WhiteOnBlack space character
cld
rep stosw

使用 BIOS 清除显存

BIOS 提供了 2 个函数可以在活动页面中滚动窗口,大部分时间是 DisplayPage 0。接下来的代码使用函数 07h 清除(整个活动页面)80x25 文本屏幕:

mov  dx, 184Fh    ; (79,24) Lowerright corner
xor  cx, cx       ; (0,0) Upperleft corner
mov  bh, 07h      ; WhiteOnBlack
mov  ax, 0700h    ; BIOS.ScrollWindowDown, AL=0 ClearWindow
int  10h

【讨论】:

@FryingRonald ctyme.com/intr/rb-0069.htm @FryingRonald 我在我的回答中包含了其他视频模式,以及更多清除屏幕的方法。

以上是关于如何清除屏幕上的 BIOS 相关信息然后打印信息?的主要内容,如果未能解决你的问题,请参考以下文章

python 如何清除屏幕内容

在 Java 中为新图形清除屏幕 (awt)

Linux系统启动原理

如何替换已经在 J​​ava 中打印在屏幕上的文本?

linux命令的清除屏幕

11.16-18 lsciipcsipcrm:清除ipc相关信息