MBR 代码分析
2015-11-18 22:10
288 查看
<1>
mov ax,0xb800
mov es,ax
一直以来,0xB8000~0xBFFFF 这段物理地址空间,是留给显卡的,由显卡来提供,用来显示文本。除非显卡出了毛病,否则这段空间总是可以访问的。
如果显卡出了毛病怎么办呢?很简单,计算机一定不会通过加电自检过程,这就是传说中的严重错误,计算机是无法启动的,更不要说加载并执行主引导扇区的内容了。
和访问主内存一样,为了访问显存,也需要使用逻辑地址,也就是采用“段地址:偏移地址”的形式,这是处理器的要求。
考虑到文本模式下显存的起始物理地址是 0xB8000,这块内存可以看成是段地址为 0xB800,偏移地址从 0x0000 延伸到 0xFFFF 的区域,因此我们可以把段地址定为0xB800。
访问内存可以使用段寄存器 DS,但这不是强制性的,也可以使用 ES。因为 DS 还有别的用处,所以在这里我们使用 ES 来指向显存所在的段。
我们把 0xB800 作为段地址传送到附加段寄存器 ES,以后就用ES 来读写显存。这样,段内偏移为 0 的位置就对应着屏幕左上角的字符。
mov ax,0xb800
mov es,ax
一直以来,0xB8000~0xBFFFF 这段物理地址空间,是留给显卡的,由显卡来提供,用来显示文本。除非显卡出了毛病,否则这段空间总是可以访问的。
如果显卡出了毛病怎么办呢?很简单,计算机一定不会通过加电自检过程,这就是传说中的严重错误,计算机是无法启动的,更不要说加载并执行主引导扇区的内容了。
和访问主内存一样,为了访问显存,也需要使用逻辑地址,也就是采用“段地址:偏移地址”的形式,这是处理器的要求。
考虑到文本模式下显存的起始物理地址是 0xB8000,这块内存可以看成是段地址为 0xB800,偏移地址从 0x0000 延伸到 0xFFFF 的区域,因此我们可以把段地址定为0xB800。
访问内存可以使用段寄存器 DS,但这不是强制性的,也可以使用 ES。因为 DS 还有别的用处,所以在这里我们使用 ES 来指向显存所在的段。
我们把 0xB800 作为段地址传送到附加段寄存器 ES,以后就用ES 来读写显存。这样,段内偏移为 0 的位置就对应着屏幕左上角的字符。
相关文章推荐
- 【ubuntu操作系统】ubuntu系统下第一个C语言程序
- JAVA_SE基础——53.什么是异常?
- C语言中模拟实现strcpy,strstr,strcat函数
- java编程思想-定制Map过程中出现的bug调试
- 模块代码重用之BaseDao
- 【推荐算法概览】《Overview of Recommender Algorithms》
- 排序算法之冒泡(下沉)排序(js和java版)
- LeetCode OJ 系列之78 Subsets --Python
- NSLayoutConstraint-代码实现自动布局的函数用法说明
- python之string操作汇总
- python之实现ftp上传下载代码(含错误处理)
- 设计模式实例学习-桥接模式
- python里面的函数参数
- Path Sum leetcode oj java
- JExcel入门,JAVA读写Excel文件
- final修饰符---final方法
- Asp.net加Sql Server写的留言板小例子
- 每天一点matlab——字符分割
- 练习PYTHON协程之GREENLET
- python之模块ftplib(实现ftp上传下载代码)