显示模式
Posted mlzrq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示模式相关的知识,希望对你有一定的参考价值。
目录
工具
首先,需要的工具软件列表:
虚拟机 qemu: qemu
显示模式
计算机在加电自检之后,会将显示初始化为80 x 25的文本模式。此时,我们可以进行文本显示了。
而计算机的显示一般有2种模式,可以通过中断来修改显示模式
- 文本模式
- 图形模式
文本模式只能显示字符,一般通过Bios中断修改。不过首先我们尝试修改显存的方式来显示字符。
1. 文本模式
刚开始启动计算机时,系统默认进入文本模式。在计算机在加电自检完成之后,会默认将显示初始化为80 x 25的文本模式。
在 80 x 25的文本模式,屏幕可以显示25行80列。显示地址段是位于0xB8000-oxBffff的地址段。
我们可以通过修改0xB8000-oxBffff地址段的值,来在屏幕上显示文本。
此模式下每2个内存地址为一组,32位代表一个文字输出: 高地址16位为颜色信息,低地址16位为文字信息
因此我们可以通过修改这段显示地址区域的值,从而来控制屏幕输出文字。
2. 80x25文本模式的颜色
在 80 x 25的文本模式,显存地址是位于0xB8000-oxBffff。
背景色颜色(背景),4位分别为 KRGB,K为是否闪烁
|值|颜色|值|颜色|
|---|---|---|---|
|0|黑色|4|红色|
|1|蓝色|5|紫色|
|2|绿色|6|黄色|
|3|青色|7|白色|
前景色颜色(文字),4位,分别为 IRGB
值 | 颜色 | 值 | 颜色 |
---|---|---|---|
0 | 黑色 | 8 | 灰色 |
1 | 蓝色 | 9 | 淡蓝色 |
2 | 绿色 | A | 淡绿色 |
3 | 青色 | B | 淡青色 |
4 | 红色 | C | 淡红色 |
5 | 紫色 | D | 淡紫色 |
6 | 黄色 | E | 淡黄色 |
7 | 白色 | F | 亮白色 |
显示字符
通过修改内存数据来显示字符
启动后实模式下-文本模式下的初始显存地址范围为[0xB8000-oxBffff]。
显存地址的值对应屏幕的显示数据,我们可以修改显存值来改变屏幕显示。
我们使用段和偏移来表示这段显存信息,段基本地址为0xB800,偏移为0x0000到0xffff。
代码如下:
mov ax,0xb800
mov ds,ax ;配置显存段地址
mov byte [0x00],‘h‘ ;输出字符,内存地址为 DS<<4 + 0x00
mov byte [0x01],0x17 ;设置颜色(背景色蓝,前景色白)
实现代码
新建一个目录rats002,在上一节的基础上添加代码。
修改boot.asm,代码如下
;Rats OS
;TAB=4
[bits 16]
org 0x7c00 ;指明程序的偏移的基地址
;引导扇区代码
jmp Entry
db 0x90
db "RATSBOOT" ;启动区的名称可以是任意的字符串(8字节)
;程序核心内容
Entry:
mov ax,0xb800
mov es,ax ;显存段地址
mov byte [es:0x00],‘r‘ ;输出字符
mov byte [es:0x01],0x17 ;设置颜色(背景色蓝,前景色白)
mov byte [es:0x02],‘a‘
mov byte [es:0x03],0x17
mov byte [es:0x04],‘t‘
mov byte [es:0x05],0x17
mov byte [es:0x06],‘s‘
mov byte [es:0x07],0x17
mov byte [es:0x08],‘o‘
mov byte [es:0x09],0x17
mov byte [es:0x0a],‘s‘
mov byte [es:0x0b],0x17
;程序挂起
Fin:
hlt ;让CPU挂起,等待指令。
jmp Fin
;扇区格式
Fill0:
resb 510-($-$$) ;处理当前行$至结束(1FE)填充0
db 0x55, 0xaa
编译成rats.img镜像文件。
运行
创建run.sh
#!/bin/bash
NASM=nasm
QEMU=qemu-system-x86_64
mkdir build
$NASM -f bin -o build/ratsos.img boot/boot.asm
$QEMU -m 128 -rtc base=localtime -fda build/ratsos.img
vitualbox运行结果如下:
在最开始的位置输出hello,world.由于没有清屏,其他位置的输出字符忽略就好。
以上是关于显示模式的主要内容,如果未能解决你的问题,请参考以下文章