自己动手从零写桌面操作系统GrapeOS系列教程——17.用汇编语言清空屏幕

科技资讯 投稿 6200 0 评论

自己动手从零写桌面操作系统GrapeOS系列教程——17.用汇编语言清空屏幕

学习操作系统原理最好的方法是自己写一个简单的操作系统。


一、清空屏幕

其实清空屏幕的原理很简单,就是将屏幕写满空格就行了。
下面来实战。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

编译运行截图如下:

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

一般我们都是先清空屏幕,再输出自己想要输出的字符串。
下面我们来看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 

编程笔记 » 自己动手从零写桌面操作系统GrapeOS系列教程——17.用汇编语言清空屏幕

赞同 (28) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽