1. 程式人生 > >顯示模式

顯示模式

目錄

工具

首先,需要的工具軟體列表:

虛擬機器 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.由於沒有清屏,其他位置的輸出字元忽略就好。