显示模式

目录

工具

首先,需要的工具软件列表:

虚拟机 qemu: qemu

显示模式

计算机在加电自检之后,会将显示初始化为80 x 25的文本模式。此时,我们可以进行文本显示了。

而计算机的显示一般有2种模式,可以通过中断来修改显示模式

  • 文本模式
  • 图形模式

文本模式只能显示字符,一般通过BIOS中断修改。不过首先我们尝试修改显存的方式来显示字符。

1. 文本模式

刚开始启动计算机时,系统默认进入文本模式。在计算机在加电自检完成之后,会默认将显示初始化为80 x 25的文本模式。

在 80 x 25的文本模式,屏幕可以显示25行80列。显示地址段是位于0xB8000-oxBffff的地址段。

我们可以通过修改0xB8000-oxBffff地址段的值,来在屏幕上显示文本。

此模式下每2个内存地址为一组,32位代表一个文字输出: 高地址16位为颜色信息,低地址16位为文字信息

扫描二维码关注公众号,回复: 4781382 查看本文章

因此我们可以通过修改这段显示地址区域的值,从而来控制屏幕输出文字。

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.由于没有清屏,其他位置的输出字符忽略就好。

猜你喜欢

转载自www.cnblogs.com/mlzrq/p/10223020.html