顯示模式
目錄
工具
首先,需要的工具軟體列表:
虛擬機器 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.由於沒有清屏,其他位置的輸出字元忽略就好。