自己動手從零寫桌面操作系統GrapeOS系列教程——17.用匯編語言清空屏幕

學習操作系統原理最好的方法是自己寫一個簡單的操作系統。


在QEMU中會默認輸出一些字符,有時候會干擾我們自己輸出的字符。一個比較好的辦法是向將屏幕清空,再輸出我們想要輸出的字符。下面就來學習如何清空屏幕。

一、清空屏幕

其實清空屏幕的原理很簡單,就是將屏幕寫滿空格就行了。
下面來實戰。mbr8.asm代碼如下:

;定義常量(作用和C語言中的#define一樣)
VIDEO_CHAR_MAX_COUNT equ 2000 ;默認屏幕最多顯示字符數。

org 0x7c00

;初始化段寄存器
mov ax,0xb800
mov es,ax ;本程序中es專用於指向顯存段

;清屏
call func_clear_screen

stop:
hlt
jmp stop 

;清屏函數(將屏幕寫滿空格就實現了清屏)
;輸入參數:無。
;輸出參數:無。
func_clear_screen:
mov ah,0x00 ;黑底黑字
mov al,' '  ;空格
mov cx,VIDEO_CHAR_MAX_COUNT ;循環控制
.start_blank:
mov bx,cx ;以下3行表示bx=(cx-1)*2 
dec bx
shl bx,1
mov [es:bx],ax ;[es:bx]表示字符對應的顯存地址(從屏幕右下角往前清屏)
loop .start_blank
ret

times 510-($-$$) db 0
db 0x55,0xaa

編譯運行截圖如下:

從上面QEMU截圖可以看到,之前QEMU默認輸出的字符已經沒有了,屏幕清空的很乾淨。

二、在清空的屏幕上輸出字符串

一般我們都是先清空屏幕,再輸出自己想要輸出的字符串。
下面我們來看mbr9.asm的代碼:

;定義常量(作用和C語言中的#define一樣)
VIDEO_CHAR_MAX_COUNT equ 2000 ;默認屏幕最多顯示字符數。

org 0x7c00 ;如果沒有該行將無法正確打印要顯示的字符串

;初始化段寄存器
mov ax,cs
mov ds,ax ;ds指向與cs相同的段
mov ax,0xb800
mov es,ax ;本程序中es專用於指向顯存段

;清屏
call func_clear_screen

;打印字符串
mov si,string1
mov di,0 ;在屏幕第1行顯示
call func_print_string

stop:
hlt
jmp stop 

;清屏函數(將屏幕寫滿空格就實現了清屏)
;輸入參數:無。
;輸出參數:無。
func_clear_screen:
mov ah,0x00 ;黑底黑字
mov al,' '  ;空格
mov cx,VIDEO_CHAR_MAX_COUNT ;循環控制
.start_blank:
mov bx,cx ;以下3行表示bx=(cx-1)*2 
dec bx
shl bx,1
mov [es:bx],ax ;[es:bx]表示字符對應的顯存地址(從屏幕右下角往前清屏)
loop .start_blank
ret

;打印字符串函數。
;輸入參數:ds:si,di。
;輸出參數:無。
;ds:si 表示字符串起始地址,以0爲結束符。
;di 表示字符串在屏幕上顯示的起始位置(0~1999)。
func_print_string:
mov ah,0x07 ;ah表示字符屬性,0x07表示黑底白字。
shl di,1 ;乘2(屏幕上每個字符對應2個顯存字節)。
.start_char: ;以點開頭的標號爲局部標號,完整形式是 func_print_string.start_char,但在同一個全局標號func_print_string內部不需要寫完整形式。
mov al,[si]
cmp al,0
jz .end_print
mov [es:di],ax ;將字符和屬性放到對應的顯存中。
inc si
add di,2
jmp .start_char
.end_print:
ret

string1:db "Hello GrapeOS!",0

times 510-($-$$) db 0
db 0x55,0xaa

mbr9.asm其實就是將mbr8.asm和mbr7.asm合併了一下。
下面來看編譯運行截圖:

從上面的QEMU截圖中可以看到,我們在清空的屏幕上第一行顯示了字符串“Hello GrapeOS!”,這就是我們想要的效果。


本講視頻版地址:https://www.bilibili.com/video/BV1DD4y137ET/
本教程代碼和資料:https://gitee.com/jackchengyujia/grapeos-course
GrapeOS操作系統QQ羣:643474045

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章