x86汇编---VGA显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heyuqian_csdn/article/details/86425119

目录

1、显示字符

1.1、VGA显存地址映射空间范围

1.2、显示字符

2、控制光标

2.1、直接读写寄存器

2.2、间接读写寄存器---关闭光标

3、结束


参考资料:《x86汇编语言-从实模式到保护模式.pdf》《5.3 在屏幕上显示文字》《8.4 用户程序的工作流程》

                    VGA Chipset Reference http://www.osdever.net/FreeVGA/vga/vga.htm

                   《INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986》

搭建好环境后,bochs启动界面如下,现在修改src.asm,实现屏幕上显示字符,关闭光标

可以学习到VGA基本显示原理,bochs调试命令,I/O读写汇编命令(in out)

1、显示字符

Video Graphics Array (VGA)是较早的一种电脑图形显示标准,规定了显卡的行为。

显卡可以把显卡内部RAM(VRAM Video Ram)映射到CPU内存地址空间,CPU按照约定好的格式向内存即VRAM写入数据即可在屏幕显示数据。如下(文本模式):

1.1、VGA显存地址映射空间范围

VGA标准中有四种地址映射范围,因为没有找到bochs中相关说明,这里通过bochs调试命令,写内存再读出的方式确定地址范围。比如在0xA0000写入0x55,再读0xA0000,如果读到0x55,则说明地址空间起始位置是0xA0000。

bochs内存调试命令如下:

使用bochs调试工具,需要用命令bochsdbg启动(如果之前保存的配置脚本运行命令是bochs,这里需要重新配置下脚本),添加断点0x7c00后运行,然后读写内存。最终可以确定地址范围为:0xB8000~0xBFFFF

1.2、显示字符

bochs启动后,BIOS在屏幕上显示的第一个字符是大写的P,我们通过调试命令修改成了小写的a:

显示‘P’修改成‘a’

2、控制光标

VGA提供了对光标显示硬件支持,通过配置显卡寄存器,可以开关光标,更改光标位置,设置光标形状(参考http://www.osdever.net/FreeVGA/vga/textcur.htm)。

配置显卡寄存器即读写I/O端口,因为I/O端口地址有限,少于显卡内部寄存器的个数,部分寄存器不能直接访问,需要通过Address Register和Data register组合起来才能访问(http://www.osdever.net/FreeVGA/vga/vgareg.htm):

VGA寄存器分为如下6组,External Registers组中的寄存器都有独立的I/O端口地址,可以直接访问。控制光标显示的寄存器位于CRT Controller Registers组内,不能直接访问

2.1、直接读写寄存器

External Regsiters组包含如下寄存器:

2.2、间接读写寄存器---关闭光标

CRT Controller (CRTC) Registers组中和光标控制相关寄存器如下,CRTC寄存器组使用的Address Register地址为0x3D4,Data register地址为0x3D5。首先向Address Register写入要修改寄存器index。然后把要写入的数据写入Data register即可(因为只需要修改其中bit5,所以采用或OR操作)。

加载运行后,原先的光标,会消失掉

3、结束

通过此次调试,进一步熟悉bochs的调试命令,了解VGA的基本显示原理(显存以及通过Adress/Data Register组合配置显卡内部寄存器),以及In/Out汇编命令

猜你喜欢

转载自blog.csdn.net/heyuqian_csdn/article/details/86425119
今日推荐