操作系统与网络实现 之六

本文介绍了如何在操作系统中设置图形模式,利用VESA BIOS扩展设置800x600的16位色彩模式,并获取显存线性地址。通过kernelloader.asm中的函数调用来实现显卡模式的切换和读取,最终在保护模式下加载kernel。
摘要由CSDN通过智能技术生成

图形模式

图形模式可以为我们显示的图片,显示汉字,为我们带来色彩艳丽、内容丰富的界面。

首先介绍设置显卡模式中断:int 10h

查看文档找到下面资料:
Int 10/AX=4F02h - VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE

这时是设置为SuperVGA模式

AX = 4F02h

BX = new video mode

我们设置成800*600模式 16位色

 

Int 10/AX=4F01h - VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION

这时是读取SuperVGA模式参数

AX = 4F01h

CX = SuperVGA video mode

ES:DI指向预先保留的256字节空间,这里将保存int 10h传来的参数,其中第40个字节开始存有显存地址的32位值。

在kernelloader.asm中又将此地址存入指定的0x10050处(值e0000000)

显示原理很简单,向显存地址填入一个16位值,代表颜色,就可以在800X600的框架里显示一个点。

下面看程序实现:

 

修改kernelloader.asm,源码如下:

 

[BITS16]

jmp main

gdt_entriesequ3;共有三个段描述符:null,os code32,os data32

peequ1;bit PE in CR0

nullequ0h

os_code32_selequ8h;1,gdt,rpl=00

os_data32_selequ10h;2,gdt,rpl=00

VESA:times256db0;分配一块区域存放 vesa 返回的信息,大小256,我们只需要其中的一个32位值

pdescrtimes6db0

gdt_tabletimes(gdt_entries*8)db0

 

set_video_mode:;设置显卡模式

pushes

 

;设置显卡模式

movax,0x4f02

movbx,0x4114;800 * 600 ( 5:6:5 ) 16位色彩

int0x10

;取得该模式下显存线性地址

movbx,0x1000

moves,bx

movdi, VESA ;es:di指向256空间,int 10h将在此填写数据

movax,0x4f01

movcx,0x114

int0x10

;40个字节开始存有显存地址0xe0000000,将此地址再存入指定的地址0x10050

moveax,[es:VESA+40]

;将此地址再存入指定的地址0x10050,

mov[es:0x50],

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值