目录
参考资料:《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汇编命令