如何清除屏幕上的 BIOS 相关信息然后打印消息?
How to clear BIOS-related info on screen then print message?
各位!我正在提高我的装配低级技能,并使自己成为一个简单的引导加载程序。我现在做了一些例程和入口点并成功地输出了一条消息,但是,我想清除屏幕,所以在输出我的消息时,它是干净的。我已经尝试制作一个例程来清除 AX
寄存器,将地址 0xb800
的内容存储到 BX
,然后复制或 MOV
ing AX
的内容] 登记。
像这样:
vram equ 0xb800
xor ax, ax
mov bx, [vram]
mov bx, ax
int 10h
它成功清除了屏幕,但我遇到了一个问题,如图所示,它拉伸了文本。
然后我搜索了一些答案。我没有找到一些答案,因为搜索结果只给我 DOS 中断以清除屏幕。
但是,我确实尝试过使用 INT 10, AH=07h
,但我不知道如何使用它。
请帮帮我谢谢! :D
文本变为 'stretched' 因为您设置了一个 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
表示再生缓冲区所在的内存段。值 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 个函数可以在活动页面中滚动 window,大部分时间是 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
各位!我正在提高我的装配低级技能,并使自己成为一个简单的引导加载程序。我现在做了一些例程和入口点并成功地输出了一条消息,但是,我想清除屏幕,所以在输出我的消息时,它是干净的。我已经尝试制作一个例程来清除 AX
寄存器,将地址 0xb800
的内容存储到 BX
,然后复制或 MOV
ing AX
的内容] 登记。
像这样:
vram equ 0xb800
xor ax, ax
mov bx, [vram]
mov bx, ax
int 10h
它成功清除了屏幕,但我遇到了一个问题,如图所示,它拉伸了文本。
然后我搜索了一些答案。我没有找到一些答案,因为搜索结果只给我 DOS 中断以清除屏幕。
但是,我确实尝试过使用 INT 10, AH=07h
,但我不知道如何使用它。
请帮帮我谢谢! :D
文本变为 'stretched' 因为您设置了一个 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
表示再生缓冲区所在的内存段。值 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 个函数可以在活动页面中滚动 window,大部分时间是 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