为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
2012-11-26 23:32
627 查看
这是因为 .com 载入内存后的起始偏址就是100h. 前面的100h字节是该程序的PSP 部分. 所以, 为了程序中对地址引用的正确, 必需加上org 100h语句。
-------------------------------------------------------------------------------------------------------------------------------------------------FFFF0h与07C00h,这两个都是机器启动后默认访问的内存地址。曾经让我一度很晕,搞不清他们之间的关系。现在终于搞明白了,写到博客司上与大家分享。
首先要知道bios是用来初始化硬件的最底层的软件(然后才是操作系统),因此计算机启动后必须最先被执行。另外我们都知道CPU只能执行内存中的内容的,而一般内存中的数据是易失性的,断电之后内容就会消失。工程师的解决方法是:将存放bios的rom芯片与内存芯片统一编址(不明白的话去看看微机原理与接口的书就明白了)。这样就可以把存放bios的ROM芯片看作是数据永远不会消失不允许被更改的内存了。
开机启动后默认的CS=FFFFh IP=0000h。这个地址就是bios的地址。这段内存空间很小,所以不能够容下操作系统等大型程序。
相对bios而言操作系统的功能更强大,更新也更快但是也需要更多的空间,通常放在硬盘中。但是如果没有bios的话,那么将会连硬盘都不能使用,又如何启动存放在硬盘中的操作系统呢?正是由于此,机器启动后自动执行bios使其它完成硬件初始化(这样包括硬盘在内的cpu以外的其他硬件设备就可以工作了)。bios完成硬件初始化的任务后,就要把权力移交给操作系统。
工程师进行了强制性的规定:到内存中的07c00h 处寻找系统的引导程序,即CS=0000h IP=7c00h。也就是说任何系统,他的引导程序都必须安排在07c00h开始的地方,否则就不能被正确的引导。当引导程序完成后我们就进入了Linux Windows等系统了。
后面为了调试方便,还可以吧org 07c00h改为0100h,生成 com文件就能直接在dos下运行。cx表示的是字符串的个数,10进制的,可以自行修改,boot sector的结束地址也是固定的,为0xAA55,呵呵,好玩
书中的代码如果要在DOS下运行,需要把org 07C00h改为org 0100h,这样做的目的是因为在DOS下,装载程序会事先创建一个称为程序段前缀(PSP)256字节的数据区,用来和被装载的程序通信,具体的细节请查验相关资料。而0100h刚好是256个字节的处,这也是代码段开始执行处。
说完程序的加载运行,让我们看看BIOS的10号中断处理子程序的显示功能。这里10号中断有很多子程序,书中用到了13子程序,此子程序就是显示字符串的,其中的参数如下:ES:BP=串地址;CX=串长度;DH=起始行;DL=起始列;BH=页号;BL=属性;AH=子程序编号,这里为13;这里BL是这样子定义的:闪烁 背景红 背景绿 背景蓝 高亮 前景红 前景绿 前景蓝(顺序为高字节到低字节)。这样BL=0Ch,二进制为:1100,由其定义可知为黑底高亮红字。
转载自:http://www.cnblogs.com/wanghj-dz/archive/2011/05/12/2044062.html,原文可能有错误,这里略作修改
相关文章推荐
- 为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
- 为什么 UEFI 方式启动的 U 盘必须使用 FAT32 文件系统?
- 解析 bootstat.dat 文件,探究为什么XP知道上次系统启动失败。。。
- 通过编写rcS文件实现系统启动后进行一系列初始设置
- windows系统无法启动,是否是文件丢失所致?
- linux启动时挂载根文件系统的过程[转]
- 2440最小根文件系统启动
- 不启动容器挂载容器文件系统的方法
- Android编译过程总结及android中各种img文件的作用以及系统启动过程
- msdn的文件系统和存储设备管理http://msdn.microsoft.com/en-us/library/aa914412.aspx
- 构造根文件系统之启动第一个程序
- 为单位领导远程制作u盘启动pe恢复系统中毒后桌面文件
- 修改linux系统配置文件 /etc/inittab 默认从字符界面启动系统
- vs2010调试C++程序时提示 无法启动文件“....exe”系统找不到指定文件
- dos系统下怎么操作文件
- 制作文件系统之三:BusyBox init的启动过程
- uboot通过bootargs设置根文件系统的启动位置
- 我的文件系统启动
- 系统启动文件BOOT.INI说明
- GNU Linux启动时文件系统mountall挂载出错问题的处理